ZOJ 3791
来源:互联网 发布:阿里云ued 编辑:程序博客网 时间:2024/06/05 02:28
dp
dp[j]表示与目标状态有j位不同的方法数
#include <cstdio>#include <cstring>#include <cctype>#include <iostream>#include <vector>#include <cstdio>#include <set>#include <algorithm>#include <map>#include <string>#include <queue>#define LL long longusing namespace std;const int maxn = 100100;const int mod = 1000000009;LL C[110][110];LL dp[2][110];void init() { memset(C, 0, sizeof(C)); C[0][0] = 1; for(int i = 0; i < 101; ++ 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; } }}int main(){ init(); int n, k, m; char s1[110], s2[110]; while(scanf("%d%d%d", &n, &k, &m) == 3) { scanf("%s%s", s1, s2); int cnt = 0; for(int i = 0; i < n; ++ i) { if(s1[i] != s2[i]) cnt++; } memset(dp, 0, sizeof(dp)); dp[0][cnt] = 1; int pre = 0; for(int i = 0; i < k; ++ i) { memset(dp[1-pre], 0, sizeof(dp[1-pre])); for(int j = 0; j <= n; ++ j) { if(dp[pre][j]) { for(int q = max(0, m-n+j); q <= j && q <= m; ++ q) { dp[1-pre][j+m-2*q] += dp[pre][j]*C[j][q]%mod*C[n-j][m-q]%mod; dp[1-pre][j+m-2*q] %= mod; } } } pre ^= 1; } //printf("%I64d\n", dp[1-pre][0]); printf("%lld\n", dp[pre][0]); } return 0;}
0 0
- zoj 3791
- ZOJ-3791
- ZOJ 3791
- zoj 3791 DP
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- ZOJ
- 什么是挂载?
- java基础-各种规则
- HDU_4004_The frog's game_二分搜索
- Android源码之使用linux内核源代码
- http请求中常用请求头和响应头代表的含义
- ZOJ 3791
- 直接拿来用!十大Material Design开源项目
- eclipse jee中创建Maven project并且转换为Dynamic web project
- java基础-循环和数组
- 死锁及如何处理死锁
- 代理传值
- 我们的征途是星辰大海
- 位计算的函数
- java基础-集合