大意略。
思路:这个DP说实话真的很难思考,根本无从下手的感觉,参考了该论文
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <string> using namespace std; const int MAXN = 72; int f[MAXN][MAXN][MAXN], f1[MAXN][MAXN][MAXN], f2[MAXN][MAXN][MAXN]; char str1[MAXN], str2[MAXN], str3[MAXN]; void init() { memset(f, 0, sizeof(f)); memset(f1, 0, sizeof(f1)); memset(f2, 0, sizeof(f2)); } void read_case() { init(); scanf("%s%s%s", str1+1, str2+1, str3+1); } int dp() { int len1 = strlen(str1+1), len2 = strlen(str2+1), len3 = strlen(str3+1); for(int i = 0; i <= len1; i++) { for(int j = 0; j <= len2; j++) { f[0][i][j] = f1[0][i][j] = f2[0][i][j] = 1; } } for(int i = 1; i <= len3; i++) { for(int j = 0; j <= len1; j++) { for(int k = 0; k <= len2; k++) { if(j) { f1[i][j][k] = f1[i][j-1][k]; if(str1[j] == str3[i]) f1[i][j][k] += f[i-1][j-1][k]; f1[i][j][k] %= 10007; } if(k) { f2[i][j][k] = f2[i][j][k-1]; if(str2[k] == str3[i]) f2[i][j][k] += f[i-1][j][k-1]; f2[i][j][k] %= 10007; } f[i][j][k] = (f1[i][j][k] + f2[i][j][k]) % 10007; } } } return f[len3][len1][len2] % 10007; } void solve() { read_case(); int ans = dp(); printf("%d\n", ans); } int main() { int T; scanf("%d", &T); while(T--) { solve(); } return 0; }