有一个由所有长为 (2n) 的合法括号序列组成的 trie,现在要求这棵树上最多的边数,符合边两两之间均没有共同节点。
Solution
首先设根的深度为 (0),我们可以只选 trie 上所有深度为偶数的点和父亲的连边,于是答案就是 trie 上深度为奇数的点的个数
然后就是一个很套路的 dp,设 (f[i][j]) 表示有了 (i) 个左括号,(j) 个右括号的方案数,则
[f[i][j]=f[i-1][j]+f[i][j-1]
]
于是答案为
[sum_{(i+j) mod 2=1} f[i][j]
]
为了方便起见可以把坐标整体 (+1)
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e+9+7;
const int N = 2005;
int n,f[N][N],ans,i,j;
signed main() {
cin>>n;
f[1][1]=1;
for(int i=2;i<=n+1;i++) for(int j=1;j<=i;j++) {
f[i][j]=(f[i-1][j]+f[i][j-1])%mod;
if((i+j)%2) ans=(ans+f[i][j])%mod;
}
cout<<ans;
}