【无标题】

「ABC217F」Make Pair Tj

题意


一共2N个学生站成一排,其中有M对朋友关系。老师每次从队列中挑出两个相邻的学生作为同桌。为了关系和睦,每次选出的两个学生必须是朋友关系。选出的两个学生离开队列,空出来的位置左右合拢。


请问老师有多少种方式选完所有学生?对于两种选人的方案,即使同桌关系相同,只要离开队列的顺序不同,也算是不同的方案。

思路


dp做。

状态设计:


设dp[l][r]表示删除区间[l,r]的总方案数。


状态转移


考虑r和谁一起删掉

+ rl一起删,那么区间$[l+1,r-1]$必须先删完:$dp[l][r]+=dp[l+1][r-1]$

+ $r$$k$一起删,那么就要删掉$[l,r-1]$,$[r+1,k-1]$,两个区间互不影响。若区间$[l,r-1]$的方案数为$x$,$[r+1,k-1]$方案数为$y$:$dp[l][r]+=x\times y\times C_\frac{r-l+1}{2}^\frac{r-k+1}{2}$

细节处理


输入的时候

    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>x>>y;
        //因为是两个两个取,所以相隔距离为奇数的不可能成为同桌 (请自行举例)
        if((y-x+1)%2==0){
            vis[x][y]=1;
            if(x+1==y||y+1==x)
                dp[x][y]=dp[y][x]=1;
        }
    }


Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353; 
int n,m,x,y;
int C[500][500],vis[500][500],dp[500][500];
void init(){//杨辉三角求组合数:C[m][n]=C[m-1][n-1]+C[m][n-1]
            //O(n^2) 
    for(int i=0;i<=n;i++){
        C[i][0]=C[i][i]=1;
        for(int j=1;j<i;j++)
            C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
    }
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>x>>y;
        //因为是两个两个取,所以相隔距离为奇数的不可能成为同桌 
        if((y-x+1)%2==0){
            vis[x][y]=1;
            if(x+1==y||y+1==x)
                dp[x][y]=dp[y][x]=1;
        }
    }
    init();//预处理组合数
    for(int len=2;len<=2*n;len+=2){
        for(int l=1;l+len-1<=n*2;l++){
            int r=l+len-1;
            if(vis[l][r])
                dp[l][r]=dp[l+1][r-1];
            //禁止写成: 
        //    for(int k=l;k<=r;k++)
        //emm...我就是这里错了
            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[len/2][(r-k+1)/2]%mod+mod)%mod;
            }
        }
    }
    cout<<dp[1][n*2];
    return 0;
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值