1. 程式人生 > 實用技巧 >Codeforces Round #683 (Div. 2, by Meet IT)D. Catching Cheaters

Codeforces Round #683 (Div. 2, by Meet IT)D. Catching Cheaters

題意

給你兩個字串\(A,B\),讓你從\(A,B\)中找到連續的子串\(C\)\(D\)\(4 * LCS(C,D) - |C| - |D|\)最大,\(LCS\)是最長公共子序列

思路

最長公共子序列的變形,只需要求出每一步的貢獻即可。

\(s1[i]==s2[j]\)時,貢獻\(+2\),但是需要注意負數的情況

\(s1[i]!=s2[j]\)時,貢獻\(-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();
    }
}