题意:给你两个字符串s 和 t , 然后在s中找k个不重叠的子串, 并且能够在t中按顺序 能找出这k个子串, 求这k个子串的最大长度和
dp[i][j][t][0] ,i是在s中的位置, j是在t中的位置,i,j跟求最大公共子串一样, t是当前子串的个数, 1说明还能继续匹配子串个数不用加,
0说明匹配结束要加个子串继续匹配
转移方程为:
如果s[i] == t[j]
dp[i][j][t][1] = max(dp[i - 1][j - 1][t - 1][0], dp[i - 1][j - 1][t][1]) + 1
dp[i][j][t][0] = max(dp[i - 1][j][t][0]
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int dp[maxn][maxn][11][2];
char s1[maxn], s2[maxn];
int main() {
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
scanf("%s", s1 + 1);
scanf("%s", s2 + 1);
int ans = 0;
s1[0] = '#'; s2[0] = '*';
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (s1[i] == s2[j]) {
for (int t = 1; t <= k; t++) {
dp[i][j][t][1] = max(dp[i - 1][j - 1][t - 1][0], dp[i - 1][j - 1][t][1]) + 1;
dp[i][j][t][0] = max(max(dp[i - 1][j][t][0], dp[i][j - 1][t][0]), max(dp[i - 1][j - 1][t][0], dp[i - 1][j - 1][t][1] + 1));
}
} else {
for (int t = 1; t <= k; t++) {
dp[i][j][t][0] = max(max(dp[i - 1][j][t][0], dp[i][j - 1][t][0]), max(dp[i - 1][j - 1][t][0], dp[i - 1][j - 1][t][1]));
}
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
for (int t = 1; t <= k; t++) {
ans = max(ans, max(dp[i][j][t][0], dp[i][j][t][1]));
}
}
}
printf("%d\n", ans);
return 0;
}
/*
5 5 3
ababa
abbba
*/ 
京公网安备 11010502036488号