class Solution {
public:
/*
子序列:不是连续的;子串:连续的
同样都用dp[i][j]分别表示s[i]到s[j]的最长的回文子序列长度(int)、是否是回文子串(bool)
在子序列中:
(2)dp[i][i]=1
(3)dp[i][j]=0(j<i)
(4)dp[i][j]=dp[i+1][j-1]+2 (if s[i]==s[j])
(5)dp[i][j]=max(dp[i+1,j],dp[i,j-1]) (if s[i]!=s[j])
*/
int longestPalindromeSubSeq(string s) {
int n = s.size();
vector<vector<int>> dp(n, vector<int>(n, 0));
for (int i = n - 1; i >= 0; i--) {
dp[i][i] = 1;
for (int j = i + 1; j < n; j++) {
if (s[i] == s[j]) {
dp[i][j] = dp[i + 1][j - 1] + 2; //
} else {
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
}
}
}
return dp[0][n - 1];
}
};