[CF1152D] Neko and Aki's Prank - 组合计数

有一个由所有长为 \(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) \bmod 2=1} f[i][j] \]

为了方便起见可以把坐标整体 \(+1\)

#include 
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<

你可能感兴趣的:([CF1152D] Neko and Aki's Prank - 组合计数)