#516 最长回文子序列(动态规划)

516. 最长回文子序列 - 力扣(LeetCode)

#5 最长回文子串(动态规划) - MOVSX

但是这次dp保存的不是是否为回文串,而是i->j可组成的最长回文子序列长度

状态转移:max(左,右,左下+2(如果s[i]==s[j]))

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int N=s.size();
        vector<vector<int>> dp(N,vector<int>(N,0));
        for(int i=0;i<N;i++) dp[i][i]=1;
        for(int i=0;i<N-1;i++) 
            if(s[i]==s[i+1]) dp[i][i+1]=2;
            else dp[i][i+1]=1;
        for(int step=2;step<N;step++){
            for(int i=0;i+step<N;i++){
                int left=dp[i][i+step-1];
                int down=dp[i+1][i+step];
                int corn=dp[i+1][i+step-1]+2*(s[i]==s[i+step]);
                if(left>=down && left>=corn) dp[i][i+step]=left;
                else if(down>=corn) dp[i][i+step]=down;
                else dp[i][i+step]=corn;
            }
        }
        return dp[0][N-1];
    }
};