题意
给你两个字符串 A , B A,B A,B,让你从 A , B A,B A,B中找到连续的子串 C C C, D D D其 4 ∗ L C S ( C , D ) − ∣ C ∣ − ∣ D ∣ 4 * LCS(C,D) - |C| - |D| 4∗LCS(C,D)−∣C∣−∣D∣最大, L C S LCS LCS是最长公共子序列
思路
最长公共子序列的变形,只需要求出每一步的贡献即可。
当 s 1 [ i ] = = s 2 [ j ] s1[i]==s2[j] s1[i]==s2[j]时,贡献 + 2 +2 +2,但是需要注意负数的情况
当 s 1 [ i ] ! = s 2 [ j ] s1[i]!=s2[j] s1[i]!=s2[j]时,贡献 − 1 -1 −1
#include<bits/stdc++.h>
using namespace std;
char s1[5005], s2[5005];
int dp[5005][5005];
void solve() {
int n, m; cin >> n >> m;
cin >> (s1 + 1) >> (s2 + 1);
int ans = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (s1[i] == s2[j]) {
dp[i][j] = max(0, dp[i - 1][j - 1]) + 2;
}else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) - 1;
}
ans = max(ans, dp[i][j]);
}
}
cout << ans << endl;
}
signed main() {
int t = 1;
while (t--) {
solve();
}
}