题解:B4336 [中山市赛 2023] 永别

· · 题解

退役后的第一篇题解,OI,永别了。

很显然应该用 O(n^2) 的做法,区间 DP 应该是个不错的选择。

可以通过本题的代码如下:

#include<bits/stdc++.h>
using ll = long long;
using namespace std;

const int N = 1e3 + 5;
int n, f[N][N];

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    cin >> n;
    string s;
    cin >> s;

    for (int i = 0; i < n; i++) {
        f[i][i] = 1;
    }
    for (int l = 2; l <= n; l++) {
        for (int i = 0; i < n - l + 1; i++) {
            int j = i + l - 1;
            if (s[i] == s[j]) f[i][j] = f[i + 1][j - 1] + 2;
            else f[i][j] = max(f[i][j - 1], f[i + 1][j]);
        }
    }
    cout << f[0][n - 1] << '\n';
    return 0;
}