【DP】ZOJ - 4114 Flipping Game

该博客主要介绍了ZOJ 4114 Flipping Game的问题,讨论了如何将两个字符串通过改变指定数量的字符在限定轮数内转换的动态规划解法。关键在于状态转移,从dp[i-1][L]转移到dp[i][j],利用组合数计算不同位置的选择方式。
摘要由CSDN通过智能技术生成

 

参考博客:2019山东省赛 ZOJ - 4114 Flipping Game dp

题目链接:传送门

【题意】:

有两个串,每次改变m个字符,改变k轮,把a变成b有多少种方法

改变 : 0 -> 1 , 1 -> 0  

必须改变m个,然后k轮之后的结果是什么?

【题解】:

看了别人的博客才知道原来是一个状态转移。

dp[i][j],指的是  在第i轮改变后,有j个不同的位置。

题目其实只是关注两个串之间有多少个不同或相同展开讨论。

从dp[i-1][L] -> dp[i][j]

这个状态的转移:

就是有L个不同转到j个不同。

后来发现,转化需要组合数。

就是从已经不同的地方上,选择x个,然后从相同的地方选择y个。

满足条件为:\large {\color{Red} x+y=m \ \ \&\&\ \ L-x+y=j}

两个方程,两个未知数,可以求出x,y来

然后进行转移:

\large {\color{Red} dp[i][j] = dp[i][j]+dp[i-1][L]*C_{L}^{x}*C_{n-L}^{y}}

注意组合数中的x,y满足相应条件即可。

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 998244353 ;
const int N = 105;
ll dp[N][N];
ll C[N][N];
void Init(){
    for(int i=0;i<N;i++){
        C[i][0] = 1;
    }
    for(int i=1;i<N;i++){
        for(int j=1;j<=i;j++){
            C[i][j] = (C[i-1][j-1] + C[i-1][j])%mod;
        }
    }
}
char a[N],b[N];
int T,n,m,k,x,y,cnt;
int main()
{

    Init();
    scanf("%d",&T);
    while(T--){
        memset(dp,0,sizeof(dp));
        cnt = 0;
        scanf("%d%d%d",&n,&k,&m);
        scanf("%s%s",a,b);
        for(int i=0;i<n;i++){
            cnt += (a[i] != b[i]);
        }

        dp[0][cnt] = 1;
        for(int i=1;i<=k;i++){

            for(int j=0;j<=n;j++){

                for(int L=0;L<=n;L++){

                    if( j-L+m < 0 ) continue;
                    if( (j-L+m)&1 ) continue;


                    y = (j-L+m) / 2;
                    x = m - y;

                    if( x<0 || y<0 || x>L || y>n-L )continue;

                    dp[i][j] += dp[i-1][L] *C[L][x]%mod * C[n-L][y]%mod;
                    dp[i][j] %= mod;
                }
            }
        }
        printf("%lld\n",dp[k][0]);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值