[编程题] lk [300. 最长上升子序列-动态规划]

[编程题] lk 300. 最长上升子序列-动态规划

题目

image-20200731174810387

输入输出

image-20200731174819372

注意的问题

这里说的是上升的可以是非连续的子序列的最长长度,可以采用动态规划来做。

思想:

image-20200731174916458

转移方程:

​ 我们在某点nums[i] 只要看其前边的0~i-1个比nums[i]小的数的最大dp[j]值。

那么,到dp[i] 的值就是在0~i-1范围的max(dp[j]+1) 、故此处涉及到两层for循环。

方法1:动态规划

class Solution {

    //方法1:动态规划
    public int lengthOfLIS(int[] nums) {
        //极端条件
        if(nums==null || nums.length==0) {return 0;}

        int max=1;
        int n = nums.length;
        int[] dp = new int[n];
        for(int i=0;i<n;i++){dp[i]=1;}  //最少每个元素的上升子序列是1

        for(int i=1;i<n;i++){
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j]){
                    //解释:在nums[i]前查看所有比nums[i]小的值的dp值,加1是到nums[i]这里本身也算一步
                    dp[i] = Math.max(dp[j]+1,dp[i]);
                }
            }
            //每次更新此dp[i]就纪录最大值
            max = Math.max(dp[i],max);
        }
        return max;
    }
}
原文地址:https://www.cnblogs.com/jiyongjia/p/13411171.html