cf1447D Catching Cheaters

给出两个字符串(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);
}
原文地址:https://www.cnblogs.com/Emcikem/p/14062255.html