$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; }