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;
}

相关文章:

  • 2022-12-23
  • 2021-06-26
  • 2022-12-23
  • 2021-05-16
  • 2022-12-23
  • 2022-12-23
  • 2021-07-31
  • 2021-05-27
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-19
  • 2022-12-23
  • 2022-12-23
  • 2021-12-22
相关资源
相似解决方案