zoukankan      html  css  js  c++  java
  • LeetCode300. 最长上升子序列

    用dp[i]记录以nums[i]结尾的最长上升子序列的长度。
    遍历数组,对于一个数,从开头遍历到这个数的前一个数,如果存在一个(0 <= j <= i - 1),nums[j] < nums[i] 且 dp[j] > 1,
    则可以考虑更新dp[i] -> dp[i] = max(dp[i], dp[j] + 1); 表示nums[i]加在nums[j]后面组成了一个新的上升子序列,
    当然,如果这个上升子序列的长度不如原来那个以nums[i]结尾的子序列的长度,则dp[i]长度还是原来的子序列的长度。

    如果nums[j]比nums[i]大,则nums[i]不能接在nums[j]后面组成一个上升子序列,则dp[i]不变 -> dp[i] = max(1, dp[i);
    1表示nums[i]自己组成了一个上升子序列,显然这个子序列长度为1.

    再用一个变量res记录最长的上升子序列的长度,每次更新dp[i]的时候也更新一下res -> res = max(res, dp[i]);

    代码如下:

    class Solution {
    public:
        int lengthOfLIS(vector<int>& nums) {
            int size = nums.size();
            if(size == 0) {
                return 0;
            }
            vector<int> dp(size);                              // dp[i]表示以nums[i]作为结尾的最长上升子序列的最大长度
            dp[0] = 1;
            int res = 1;                                       // res是整个数组中最长的上升子序列的长度,最少也是1,表示最长上升子序列只有一个数
            for(int i = 1; i < size; ++i) {
                for(int j = 0; j < i; ++j) {
                    if(nums[i] > nums[j]) {
                        dp[i] = max(dp[i], dp[j] + 1);
                    } else {
                        dp[i] = max(1, dp[i]);
                    }
                }
                res = max(res, dp[i]);
            }
            return res;
        }
    };
    
  • 相关阅读:
    博客发在oschina
    博客发在oschina
    C#将dll打包到程序中
    C#将dll打包到程序中
    WPF checkbox文字下掉
    WPF checkbox文字下掉
    手机1520 win8.1升级win10
    CRITICAL **: Couldn't acquire global lock, snapshots will not be consistent: Access denied
    [学习笔记]Dsu On Tree
    手机1520 win8.1升级win10
  • 原文地址:https://www.cnblogs.com/linrj/p/13572680.html
Copyright © 2011-2022 走看看