516. 最长回文子序列
class Solution: def longestPalindromeSubseq(self, s: str) -> int: # 本题的核心是怎么进行状态转移 # 对于 s[l] != s[r]的情况下,s[l:r]中的最大回文子序列来自于 max(s[l:r-1],s[l+1,r]) dp = [[0]*len(s) for _ in range(len(s))] lenS = len(s) for i in range(lenS): dp[i][i] = 1 # 对DP数组,数组边界分析 # 1. 对于左边界,在更新DP时需要取到i+1,所以i是倒序遍历 # 2. 对于右边界,其在左边界右边并且不能重合所以是 range(l+1,lenS) for l in range(lenS-2,-1,-1): for r in range(l+1,lenS): if s[l] == s[r]: dp[l][r] = dp[l+1][r-1]+2 else: dp[l][r] = max(dp[l+1][r],dp[l][r-1]) return dp[0][-1]