关于动态规划【力扣300.最长递增子序列的思考】

关于动态规划【力扣300.最长递增子序列的思考】
1、有问题的时候打印dp数组看一下问题在哪里。打印数组代码如下图所示解答错误如下图所示上面两个【解答错误】说明初始化没问题但是dp数组里的值没有更新。说明递推关系有问题没有正确计算dp数组的值。定位问题如下图所示解决问题修改代码如下图所示2、dp数组的定义很重要问题一怎么在阅读题目的时候确定dp数组的含义问题二dp数组是用一维还是二维问题三dp数组是用一维的一个变量还是两个回答上述三个问题的第一个问题看题目的问题是什么这题是要找到一个东西的长度。那么就让dp数组的含义为【最长递增子序列的长度为dp[]】。回答上述三个问题的第二个问题比如0-1背包问题是如果选了一个物品状态改变的对象有物品和书包两个。物品的状态由没被选变成了被选书包的状态由没加这个物品的重量变成了加了这个物品的重量。本题在找最长递增子序列的时候只会影响一个对象最长子序列的长度。遍历到了下一个新的位置最长子序列的长度又有可能变了但是变的对象只有这一个。所以dp数组选用一维的。回答上述三个问题的第三个问题本题用了dp[i]和dp[j]用了两个变量i和j。首先由第二个问题的回答(遍历到了下一个新的位置最长子序列的长度又有可能变了)可知每移动到下一个位置最长子序列的长度就有可能会变。所以dp[i]表示数组下标从0到i截止位置i的最长子序列长度为dp[i]。但是因为i每往后移动一位都会引进一个新的数字这个数字可能会对最长子序列长度的计算有影响所以要用第二个变量j来表示这个影响。用dp[i]表示当前最长子序列的长度j遍历数组下标从0到idp[j]表示在当前截止位置i之前已经统计过的到截止位置j的最长子序列的长度。在前面统计过的dp[j]基础上计算dp[i]。所以要用两个变量。