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