最长回文子序列

题目描述

给定一个字符串S ,找到其中最长的回文子序列,并返回该序列的长度。

输入描述

输入为一个只包含小写英文字母的字符串S,最大长度不超过4000。

输出描述

输出最长回文子序列的长度。

测试用例

输入

abcb

输出

3
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAXN 4005
ll dp[MAXN][MAXN];
string s;
int main(){
    cin >> s;
    ll n = s.size();
    for (ll i = 1; i <= n; i++)
        dp[i][i] = 1;
    for (ll i = 1; i <= n; i++){
        for (ll j = 1; j + i <= n;++j){
            if(s[j-1] == s[j+i-1])
                dp[j][j+i] = dp[j+1][j+i-1] + 2;
            else
                dp[j][j+i] = max(dp[j+1][j+i], dp[j][j+i-1]);
        }
    }
    cout << dp[1][n];
    return 0;
}