- 什么是递增子序列?
- 在数组中需要选取某些元素,元素要保持递增的,元素之间可以不连续,但是要保证是数组原有的顺序
- dp数组的定义?
- dp[i]表示的是:从任意位置开始,以nums[i]为结尾的所有递增子序列中,最长递增子序列的长度为dp[i]
- 递推公式
if (numbes[i] > nums[j]) dp[i] = max(dp[i], dp[j]+1)
- 如果i位于j右侧,i的最长递增子序列为dp[i],j的最长递增子序列为dp[j]
- 如果nums[i] > nums[j],那么dp[i] = dp[j] + 1
- 初始值
- 默认dp[i]=1
- 遍历顺序
- 一定是从小到大遍历
let result = 0 // 以nums[i]为结尾的最长递增子序列的长度可以由nums[0]为结尾的最长递增子序列的长度、nums[1]为结尾的最长递增子序列的长度、……、nums[i-1]为结尾的最长递增子序列的长度 比较得到 // 都是依赖于前面的元素与当前的i进行比较 // dp[0] = 0,故从1开始 for (i = 1; i < nums.length; i++) { // j要遍历所有的nums[j]与i做比较 // 在获取到nums[i]的每个子串的时候,也就是nums[0]、……、nums[i-1]都尝试是否能将i位置的数添加到这个子串里,最后取所有子串尝试加入i所得到的最大值 for (j = 0; j < i; i++) { if (nums[i] > nums[j]) { dp[i] = Math.max(dp[i], dp[j] + 1) } } // 计算当前nums的最长递增子序列 将nums遍历,寻找最大的dp[i] result = Math.max(result, dp[i]) }=