相当于求该字串与其翻转后的字串的最长公共子序列

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;

int maxSeqLen(const string& s1, const string& s2){    //求两字符串的最大子序列长度
    vector<vector<int>> dpm(2, vector<int>(s2.size(), 0));
    int res = 0;
    for(int i = 0; i < s1.size(); ++i){
        for(int j = 0; j < s2.size(); ++j){
            if(i == 0 && j == 0){
                if(s1[i] == s2[j])
                    dpm[i][j] = 1;
                else dpm[i][j] = 0;
            }
            else if(i == 0){
                if(dpm[i][j-1] || s1[i] == s2[j])
                    dpm[i][j] = 1;
                else dpm[i][j] = 0;
            }
            else if(j == 0){
                if(dpm[(i-1)%2][j] || s1[i] == s2[j])
                    dpm[i%2][j] = 1;
                else dpm[i%2][j] = 0;
            }
            else{
                if(s1[i] == s2[j])
                    dpm[i%2][j] = dpm[(i-1)%2][j-1]+1;
                else dpm[i%2][j] = max(dpm[(i-1)%2][j], dpm[i%2][j-1]);
            }
        }
    }
    return dpm[(s1.size()-1)%2][s2.size()-1];
}

int main(){
    string str;
    cin >> str;
    string rstr = str;
    reverse(rstr.begin(), rstr.end());
    cout << maxSeqLen(str, rstr);
    
    return 0;
}