图片说明

dp[i][j]的意义:在子串 s[i...j] 中,最长的回文子串长度。

#include <bits/stdc++.h>

using namespace std;

int longestPalindromeSubseq(const string& str) {
    int length = str.size();
    vector<vector<int> > dp(length, vector<int>(length, 0));

    // 初始对角值设为 1
    for (int i = 0; i < length; i++) {
        dp[i][i] = 1;
    }

    // 只有上三角矩阵是起作用的
    // 从下往上,从左往右遍历
    for (int i = length - 2; i >= 0; i--) {
        for (int j = i + 1; j < length; j++) {
            // 如果 str[i] == str[j]
            if (str[i] == str[j])
                dp[i][j] = dp[i+1][j-1] + 2;
            else {
                dp[i][j] = std::max(dp[i][j-1], dp[i+1][j]);
            }
        }
    }

    return dp[0].back();

}

int main(){
    // 输入字符串
    string inputStr{};
    cin >> inputStr;

    cout << longestPalindromeSubseq(inputStr);

    return 0;
}