AtCoder Beginner Contest 217 F - Make Pair (区间dp)

简介: AtCoder Beginner Contest 217 F - Make Pair (区间dp)

linkkkkk

题意:

有2 ∗ n个数,给出m对关系( a , b )表示a-b有联系。每次将这些数排成一排,如果相邻两个数有联系的话就可以消去,求方案数。

思路:

d p [ l ] [ r ]表示将[ l , r ]之间的数消去的方案数。

枚举中间点k的时候,假设k − r有联系,那么区间就可以分为[ l , k − 1 ] , [ k + 1 , r − 1 ]两段,贡献是

dp[l][k1]dp[k+1][r1]C2rl+12kl

如果两个数之间的数的个数是奇数的话,这两个数之间有联系也是对答案没有影响的;同理枚举k kk的时候也要保证分出来的两段区间是偶数个数。

代码:

ll n,m,dp[2100][2100];
bool vis[2100][2100];
vector<int>g[1100];
ll c[2100][2100];
void init(){
  for(int i=0;i<2100;i++)
    for(int j=0;j<=i;j++){
      if(j==0) c[i][j]=1;
      else c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
    }
}
int main() {
  init();
    n=read,m=read;
    rep(i,1,m){
      int u=read,v=read;
      if((v-u-1)%2) continue;
      vis[u][v]=1;
      if(abs(u-v)==1){
        dp[u][v]=dp[v][u]=1;
      }
    }
    for(int len=2;len<=2*n;len+=2){
      for(int l=1;l+len-1<=2*n;l++){
        int r=l+len-1;
        if(vis[l][r]) dp[l][r]=dp[l+1][r-1];
        for(int k=l+2;k<r;k+=2)
          if(vis[k][r]){
            dp[l][r]=(dp[l][r]+dp[l][k-1]*dp[k+1][r-1]%mod*c[(r-l+1)/2][(k-l)/2]%mod)%mod;
          }
        //cout<<dp[l][r]<<endl;
      }
    }
    printf("%lld\n",dp[1][2*n]);
    return 0;
}
目录
相关文章
|
算法
light oj 1258 - Making Huge Palindromes(KMP)
ight oj里这个题目是属于KMP分类的,但乍看好像不是kmp,因为只有一个字符串。要想的到一个回文串,把该字符串翻转接到原串后面必然是一个回文串,但并不一定是最短的。我们必须考虑怎么把两个串尽量融合在一起,这就要看翻转串的前段与原串的后段有多少是匹配的了,这里就用到了KMP算法。
38 1
codeforces 317 A Perfect Pair
我先排除了输出-1的,然后再考虑如何计算最小的步数。我们主要在每一步中最小一个加上另一个就可以了,这是朴素的求法,但可能出现这样的情况 比如 -100000000 1 10000000 这样的话会循环100000000多次,肯定超时,所以我们要加快速度。
48 0
AtCoder Beginner Contest 214 D.Sum of Maximum Weights (思维 并查集)
AtCoder Beginner Contest 214 D.Sum of Maximum Weights (思维 并查集)
120 0
|
机器学习/深度学习 人工智能 Java
AtCoder Beginner Contest 215 D - Coprime 2 (质因子分解 gcd)
AtCoder Beginner Contest 215 D - Coprime 2 (质因子分解 gcd)
112 0
AtCoder Beginner Contest 133 E - Virus Tree 2(组合数学)
AtCoder Beginner Contest 133 E - Virus Tree 2(组合数学)
110 0
|
机器学习/深度学习
AtCoder Beginner Contest 215 F - Dist Max 2 (二分 单调队列)
AtCoder Beginner Contest 215 F - Dist Max 2 (二分 单调队列)
142 0
|
机器学习/深度学习
AtCoder Beginner Contest 218 C - Shapes (模拟)
AtCoder Beginner Contest 218 C - Shapes (模拟)
150 0
AtCoder Beginner Contest 176 D - Wizard in Maze(01BFS)
AtCoder Beginner Contest 176 D - Wizard in Maze(01BFS)
119 0