您的位置:首页 > 其它

zoj 3791 An Easy Game

2014-06-21 18:40 363 查看
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3791

题目大意:给你两个长度为n的01串,第一个为起始串,另一个为目标串。给你k次操作,每次选择起始串的m个不同的位置取反(0变1,1变0),问k次操作以后有多少种方案能使得起始串变成目标串。

dp[i][j]表示第i步后有就j个不匹配的步数。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define maxn 200
using namespace std;
const int mod=1e9+9;

ll c[maxn][maxn],dp[maxn][maxn];
int n,k,m;
char str1[maxn],str2[maxn];

void get()
{
for(int i=0; i<maxn; i++) c[i][0]=1;
for(int i=1; i<maxn; i++)
{
for(int j=1; j<=i; j++)
{
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
}
}

int main()
{
get();
while(scanf("%d%d%d",&n,&k,&m)!=EOF)
{
scanf("%s",str1);
scanf("%s",str2);
int cnt=0;
for(int i=0; i<n; i++)
{
if(str1[i]!=str2[i]) cnt++;
}
memset(dp,0,sizeof(dp));
dp[0][cnt]=1;
for(int i=0; i<k; i++)
{
for(int j=0; j<=n; j++)
{
for(int x=0; x<=m; x++)
{
if(j+m-2*x<0) break;
if(j+m-2*x>n) continue;
dp[i+1][j+m-2*x]=(dp[i+1][j+m-2*x]%mod+c[j][x]*c[n-j][m-x]%mod*dp[i][j]%mod)%mod;
}
}
}
printf("%lld\n",dp[k][0]);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: