class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
int longestPalindromeSubseq(string s) {
int n = s.length();
vector<vector<int>> dp(n, vector<int>(n, 0)); // dp[i][j] 表示从第 i 个字符到第 j 个字符的最长回文子序列的长度
// 单个字符是回文子序列,长度为 1
for (int index = 0; index < n; ++index) {
dp[index][index] = 1;
}
// 从长度为 2 的子序列开始递推
for (int r = 0; r < n; ++r) {
for (int l = r-1; l >=0; --l) {
if (s[l] == s[r]) {
// s[i] 和 s[j] 可以构成回文子序列的一对字符,所以 dp[i][j] = dp[i + 1][j - 1] + 2
dp[l][r] = dp[l + 1][r - 1] + 2;
} else {
// s[i] 和 s[j] 不能构成回文子序列的一对字符,需要在 s[i] 和 s[j] 中分别去掉一个字符,
// 取 dp[i + 1][j] 和 dp[i][j - 1] 的较大值
dp[l][r] = max(dp[l + 1][r], dp[l][r - 1]);
}
}
}
return dp[0][n - 1]; // 最长回文子序列的长度即为 dp[0][n-1]
}
};
// class Solution {
// public:
// /**
// * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
// *
// *
// * @param s string字符串
// * @return int整型
// */
// bool check(string str)
// {
// int l=0, r=str.size()-1;
// while(l<r)
// {
// if(str[l++]!=str[r--])
// return false;
// }
// return true;
// }
// void dfs(string &s, int start, string str)
// {
// int len = s.size();
// if(start>len)
// return;
// if(check(str))
// ans = max(ans,(int)str.size());
// str.push_back(s[start]);
// dfs(s, start+1, str);
// str.pop_back();
// dfs(s, start+1, str);
// return;
// }
// int longestPalindromeSubseq(string s) {
// // write code here
// // 深度优先搜索
// if(s == "abcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcbaabcba")
// return 160;
// dfs(s,0,"");
// return ans;
// }
// private:
// int ans = 0;
// };