题意:给你两个字符串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 */