链接
题目大意:
给出两个字符串a, b,求max(4lcs(c, d) - |c| - |d|) ,其中,c,d是字符串a,b的子串。
思路:
记 f[i][j] a串前i个,b串前j个所能构成的最大的4lcs(c, d) - |c| - |d|。
如果 a[i] = b[j], 则f[i][j] = f[i-1][j-1] + 4*1 - 1- 1 = f[i-1][j-1] + 2;
如果 a[i] != b[j], 则f[i][j] = max{f[i-1][j] - 1, f[i][j-1] - 1, 0 }
#include <bits/stdc++.h>
using namespace std;
const int N = 5010;
char s1[N], s2[N];
int n, m, dp[N][N], res;
int main()
{
scanf("%d%d", &n, &m);
scanf("%s%s",s1+1, s2+1);
for(int i = 1;i <= n; ++ i) {
for(int j = 1;j <= m; ++ j) {
if(s1[i] == s2[j]) {
dp[i][j] = max(dp[i][j], dp[i-1][j-1] + 2);
}else {
dp[i][j] = max(dp[i-1][j], dp[i][j-1]) - 1;
}
if(dp[i][j] < 0) dp[i][j] = 0;
res = max(res, dp[i][j]);
}
}
cout << res << "\n";
}