有一个由所有长为 \(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 <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;
}

相关文章:

  • 2022-01-12
  • 2022-01-25
  • 2022-12-23
  • 2022-12-23
  • 2021-05-16
  • 2022-12-23
  • 2021-06-29
  • 2021-10-11
猜你喜欢
  • 2021-12-31
  • 2022-12-23
  • 2022-12-23
  • 2022-01-06
  • 2021-11-04
  • 2022-12-23
  • 2021-08-29
相关资源
相似解决方案