给出两个字符串(a,b),在(a)中找一个子串,(b)中找一个子串,求最大贡献值
考虑(dp[i][j])表示a中以(i)结尾,b中以(j)结尾时的最大值
考虑如果两个字符相同,那么值就加2,(dp[i][j] = max(dp[i - 1][j - 1], 0) + 2)
如果两个字符不相同,那么值就是减一,(dp[i][j] = max(dp[i - 1][j - 1] - 2, max(dp[i - 1][j], dp[i][j - 1] - 1)))
出现子串,设dp时考虑以i为结尾时作为状态
void solve(int kase){
scanf("%d%d", &n, &m);
scanf("%s", s + 1); scanf("%s", t + 1);
int ans = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(s[i] == t[j]) dp[i][j] = max(dp[i - 1][j - 1], 0) + 2;
else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) - 1;
dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] - 2);
}
ans = max(ans, dp[i][j]);
}
}
printf("%d
", ans);
}