ZOJ 3791

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 long
using 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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章