动态规划-最长递增子序列

55 阅读1分钟
  • 什么是递增子序列?
    • 在数组中需要选取某些元素,元素要保持递增的,元素之间可以不连续,但是要保证是数组原有的顺序
  • 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])
    }=