描述
反向遍历
# input: abcda output: 3(aca)def MaxPalindromixSub(s: str):# dp[i][j] s[i, j]闭区间内的最长回文子列,# 注意dp数组遍历的方向dp = [[0 if i != j else 1 for j in range(len(s))] for i in range(len(s))]for row in dp:print(row)# 反向遍历: 从最后一行开始for i in range(len(s) - 1, -1, -1):for j in range(i + 1, len(s)):if s[i] == s[j]:dp[i][j] = 2 + dp[i + 1][j - 1]else:dp[i][j] = max(dp[i][j - 1],dp[i + 1][j])for row in dp:print(row)if __name__ == '__main__':MaxPalindromixSub('aba')
- base case
[1, 0, 0]
[0, 1, 0]
[0, 0, 1]
- output
斜着遍历
# 斜着遍历, 替换上面的双重for, 结果是一样的.for k in range(1, len(s)): # 第几斜【1,】 主对角线是base case 不用遍历j = k # 初始化 列标for i in range(0, len(s) - k):if s[i] == s[j]:dp[i][j] = 2 + dp[i + 1][j - 1]else:dp[i][j] = max(dp[i][j - 1],dp[i + 1][j])j = j + 1
总结
dp数组的遍历方向可能不同 正的 反的 斜的
- 可以根据base base 来分析
还可以根据最长公共子列的方法来分析(正序, 倒序)
