This commit is contained in:
programmercarl
2023-01-06 12:36:38 +08:00
parent bbbb3aed22
commit 98ceaa93b7
26 changed files with 134 additions and 83 deletions

View File

@@ -56,7 +56,7 @@
如果这里看不懂回忆一下dp[i][j]的定义)
如果s[i]与s[j]不相同说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子的长度那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。
如果s[i]与s[j]不相同说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。
加入s[j]的回文子序列长度为dp[i + 1][j]。
@@ -91,13 +91,13 @@ for (int i = 0; i < s.size(); i++) dp[i][i] = 1;
4. 确定遍历顺序
从递公式dp[i][j] = dp[i + 1][j - 1] + 2 和 dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]) 可以看出dp[i][j]是依赖于dp[i + 1][j - 1] 和 dp[i + 1][j]
从递公式中,可以看出,dp[i][j] 依赖于 dp[i + 1][j - 1] dp[i + 1][j] 和 dp[i][j - 1],如图:
也就是从矩阵的角度来说dp[i][j] 下一行的数据。 **所以遍历i的时候一定要从下到上遍历这样才能保证下一行的数据是经过计算的**
![](https://code-thinking-1253855093.file.myqcloud.com/pics/20230102172155.png)
递推公式dp[i][j] = dp[i + 1][j - 1] + 2dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]) 分别对应着下图中的红色箭头方向,如图:
**所以遍历i的时候一定要从下到上遍历这样才能保证下一行的数据是经过计算的**
![516.最长回文子序列2](https://img-blog.csdnimg.cn/20210127151452993.jpg)
j的话可以正常从左向右遍历。
代码如下: