zoukankan      html  css  js  c++  java
  • [CF1409F] Subsequences of Length Two

    Description

    给定一个长度为 (n le 200) 的字符串 (S),和一个长度为 (2) 的字符串 (T),可以在 (S) 中任意修改不超过 (m) 个字符得到 (S'),求 (S') 中与 (T) 相等的子序列的最大数量。

    Solution

    (T) 串为 ab,则定义 (f[i][j][k]) 表示对 (S') 中的前 (i) 位,其中有 (j)a,且修改了 k 次的情况下,子序列的最大数量。转移时只需要枚举是否修改当前字符即可。

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 205;
    
    char s[N], t[N];
    int f[N][N][N], n, m, ans;
    
    void upd(int &x, int y)
    {
        x = max(x, y);
    }
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        cin >> n >> m >> s + 1 >> t + 1;
        char a = t[1], b = t[2];
    
        memset(f, -0x3f, sizeof f);
        f[0][0][0] = 0;
    
        for (int i = 1; i <= n; i++)
        {
            for (int j = 0; j <= i; j++)
            {
                for (int k = 0; k <= min(i, m); k++)
                {
                    upd(f[i][j + (s[i] == a)][k], f[i - 1][j][k] + (s[i] == b) * j);
                    upd(f[i][j + 1][k + 1], f[i - 1][j][k] + (a == b) * j);
                    upd(f[i][j + (a == b)][k + 1], f[i - 1][j][k] + j);
                }
            }
        }
    
        for (int i = 1; i <= n; i++)
            for (int j = 0; j <= n; j++)
                for (int k = 0; k <= m; k++)
                    ans = max(ans, f[i][j][k]);
    
        cout << ans << endl;
    }
    
  • 相关阅读:
    7月17日
    7月16日学习记录
    7月15日学习记录
    git 学习
    投稿相关
    ubuntu16.04 安装以及要做的事情
    python学习使用
    图像相关
    不识别移动硬盘
    深度学习
  • 原文地址:https://www.cnblogs.com/mollnn/p/13909996.html
Copyright © 2011-2022 走看看