70: libreoj #2424 区间dp

 

$des$

$sol$

$f_{i, j, k} => a => [1, i], b => [1, j], a_i = b_j | a_i != b_j , a_i => 0 / 1 $
$g_{i, j, k} => a => [1, i], b => [1, j], a_i = b_j, a_i => 1$
转移时:
$a_i = b_j => g_{i, j, k} = g_{i - 1, j - 1, k} + f_{i - 1, j - 1, k - 1}$
$a_i != b_j => g_{i, j, k} = 0$
$f_{i, j, k} = g_{i - 1, j, k} + f_{i - 1, j, k}$

$code$

#include <bits/stdc++.h>

using namespace std;

#define gc getchar()
inline int read() {
    int x = 0; char c = gc;
    while(c < '0' || c > '9') c = gc;
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc;
    return x;
}

const int Mod = 1e9 + 7;

const int N = 1005;

int n, m, k_;
int f[3][N][N], g[3][N][N];
char a[1005], b[N];    

int main() {
    cin >> n >> m >> k_;
    scanf("%s%s", a + 1, b + 1);
    f[0][0][0] = 1;
    int cur = 1;
    for(int i = 1; i <= n; i ++, cur ^= 1) {
        f[cur][0][0] = 1;
        for(int j = 1; j <= m; j ++) {
            for(int k = 1; k <= k_; k ++) {
                if(a[i] == b[j]) g[cur][j][k] = (g[cur ^ 1][j - 1][k] + f[cur ^ 1][j - 1][k - 1]) % Mod;
                else g[cur][j][k] = 0;
                f[cur][j][k] = (g[cur][j][k] + f[cur ^ 1][j][k]) % Mod;
            }
        }
    }
    
    cout << f[cur ^ 1][m][k_];
    return 0;
}

 

posted @ 2018-10-31 10:12  xayata  阅读(132)  评论(0编辑  收藏  举报