string longestPalindrome(string s){int n = s.size();
vector<vector<bool>>dp(n,vector<bool>(n ,false));for(int i =0; i < n; i++) dp[i][i]=true;int startIdx =0;int maxLen =1;for(int len =2; len <= n; len++){for(int i =0; i <= n - len; i++){int j = i + len -1;if(s[i]== s[j]){if(len <4|| dp[i +1][j -1]){
dp[i][j]=true;}if(dp[i][j]&& maxLen < len){
maxLen = len;
startIdx = i;}}}}return s.substr(startIdx, maxLen);}
516. 最长回文子序列
dp[i][j]:s[i-j]区间内回文子序列的长度
intlongestPalindromeSubseq(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 len =2; len <= n; len++){for(int i =0; i <= n - len; i++){int j = i + len -1;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];}