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
",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
",dfs(0,0,0));
return 0;
}