cf1447D Catching Cheaters - DP

给出两个字符串\(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\n", ans);
}
posted @ 2020-11-30 16:56  Emcikem  阅读(79)  评论(0编辑  收藏  举报