D. Neko and Aki's Prank 记忆化搜索 优化 深度搜索

D. Neko and Aki's Prank 记忆化搜索 优化 深度搜索

题目大意:

给你一个n,你是能够构造出一个长度为2*n的合法括号序列,然后把这些括号序列构造成一个字典树的形式,每一次操作你可以对一条边染色。染完色之后,和这条边相邻的边都不能被染色。

然后问你这棵树最多能染多少条这样的边

题解:

这个难度不大,思路也很简单,但是难点在如果直接模拟这棵树,那么会TLE,然后我就搜了一下题解,发现可以使用 记忆化搜索 ,以前感觉记忆化搜索好难,但是写了这个题目之后感觉就是一个优化的方法。复杂度是 数组的大小

但是这个题目我没有想到用记忆化搜索来优化这个 深搜。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
const int maxn = 3e3+10;
const int mod = 1e9+7;
typedef long long ll;
int n;
ll dp[maxn][maxn];
ll dfs(int x,int y,int dep){
//    printf("x = %d y = %d dep = %d\n",x,y,dep);
    if(dp[dep][x]!=-1) return dp[dep][x];
    ll ans = 0;
    if(x<n) ans=dfs(x+1,y,dep+1);
    if(x>y&&y<n) ans=(ans+dfs(x,y+1,dep+1))%mod;
    if(dep&1) ans = (ans+1)%mod;
    dp[dep][x] = ans;
    return ans;
}

int main(){
    memset(dp,-1,sizeof(dp));
    scanf("%d",&n);
    printf("%lld\n",dfs(0,0,0));
    return 0;
}
posted @ 2021-01-31 16:44  EchoZQN  阅读(55)  评论(0编辑  收藏  举报