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个不匹配的步数。
View Code
题目大意:给你两个长度为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
相关文章推荐
- ZOJ 3791 An Easy Game
- ZOJ 3791 An Easy Game DP
- zoj 3791 An Easy Game
- ZOJ 3791 An Easy Game(dp+组合数)
- ZOJ 3791 An Easy Game(DP)
- zoj 3791 An Easy Game dp
- ZOJ_3791_An Easy Game(DP)
- ZOJ 3791 An Easy Game
- ZOJ 3791 An Easy Game (DP)
- ZOJ 3791 An Easy Game [组合计数]
- zoj 3791 An Easy Game(dp)
- ZOJ 3791 An Easy Game[dp]
- ZOJ 3791 An Easy Game[dp]
- ZOJ 3791 An Easy Game
- ZOJ_3791 An Easy Game[ 二维dp ]
- ZOJ 3791 An Easy Game
- poj-3791-An Easy Game-记忆化搜索
- poj-3791-An Easy Game-记忆化搜索
- 校赛 An Easy Number Game 回溯
- ZOJ3791 An Easy Game(DP)