Codeforces Round #683 (Div. 2, by Meet IT)D. Catching Cheaters
阿新 • • 發佈:2020-11-16
題意
給你兩個字串\(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(); } }