Update
This commit is contained in:
@@ -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的时候一定要从下到上遍历,这样才能保证,下一行的数据是经过计算的**。
|
||||

|
||||
|
||||
递推公式:dp[i][j] = dp[i + 1][j - 1] + 2,dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]) 分别对应着下图中的红色箭头方向,如图:
|
||||
**所以遍历i的时候一定要从下到上遍历,这样才能保证下一行的数据是经过计算的**。
|
||||
|
||||

|
||||
j的话,可以正常从左向右遍历。
|
||||
|
||||
代码如下:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user