[luoguP2679] 子串(DP)
气死我了,自己YY的方法只能得70分。
一个下午都在搞这道题。
至于正解,真的不想写了。
请移步 here
#include <cstdio> #define M 201 #define N 1001 #define p 1000000007 #define LL long long int n, m, t; char A[N], B[M]; LL f[2][M][M], sum[2][M][M]; int main() { int i, j, k; scanf("%d %d %d", &n, &m, &t); scanf("%s %s", A + 1, B + 1); for(i = 1; i <= n; i++) { sum[(i & 1) ^ 1][0][0] = 1; for(j = 1; j <= m; j++) for(k = 1; k <= t; k++) { if(A[i] != B[j]) f[i & 1][j][k] = 0; if(A[i] == B[j]) f[i & 1][j][k] = (f[(i & 1) ^ 1][j - 1][k] + sum[(i & 1) ^ 1][j - 1][k - 1]) % p; sum[i & 1][j][k] = (sum[(i & 1) ^ 1][j][k] + f[i & 1][j][k]) % p; } } printf("%lld\n", sum[n & 1][m][t]); return 0; }