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