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



京公网安备 11010502036488号