题面链接:https://codeforces.com/contest/1152/problem/D
难度:2000
题意:将所有长度为2N的括号序列构造成一颗字典树。
然后在这个字典树中选取最多的边 满足所有边都没有公共端点。
思路:容易看出构造方法其实就是选取所有长度为奇数的序列数之合
这个题就转化为一个简单的计数dp
方程:dp[i][j] = dp[i-1][j] +dp[i-1][j-1];
表示前i个位置有j个 (
最后统计合法的长度为奇数的序列有多少个
#include <bits/stdc++.h>
using namespace std;
long long dp[2005][2005];
int mod = (int)1e9 +7;
int main()
{
int n;
cin>>n;
n*= 2;
long long ans = 0;
dp[0][0] = 1;
for(int i=1;i<=n;i++){
for(int j=(i+1)/2;j<=i;j++){
dp[i][j] = dp[i-1][j] +dp[i-1][j-1];
dp[i][j] %= mod;
}
}
for(int i=1;i<=n;i+=2){
for(int j=(i+1)/2;j<=i;j++){
if(j>n/2) continue;
ans += dp[i][j];
ans %= mod;
}
}
cout<<ans;
return 0;
}