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
原创粉丝点击