zoukankan      html  css  js  c++  java
  • 动态规划之最长上升子序列

    给定一个无序的整数数组,找到其中最长上升子序列的长度。

    示例:

    输入: [10,9,2,5,3,7,101,18]
    输出: 4 
    解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4

    class Solution {
    public: 
        int lengthOfLIS(vector<int>& nums) {
            if(nums.size() == 0) 
            return 0;
            vector<int> dp(nums.size()+1,1);
            for(int i = 0; i < nums.size(); i++){
                dp[i] = 1;
                for(int j = 0; j < i; j++){
                    if(nums[j] < nums[i]){
                        dp[i] = max(dp[i],dp[j]+1);
                    }
                }
            }
            int max1 = 0;
            for(int i = 0;i < dp.size();i++){
                max1 = max(dp[i],max1);
            }
            return max1;
    
        }
    };

    1)使用vector定义不定长集合

    2)使用自带的max函数

    3)dp[i]表示第i个数加入dp中的结果。当第i个数加入dp中时,我们依次遍历[0,i)的所有情况。一开始,我们总是假设dp[i] = 1;然后逐步增大j的值,当出现满足条件的情况,让他进行dp[i] 的值更新。

    例如:[10,9,2,5,3,7,101,18]

    dp[0] = 1, dp[1] = 1,dp[2] = 1,dp[3]的时候,即5加入时,我们发现出现2 < 5的情况,那么dp[3] 就从一路等于dp[0] dp[1] dp[2] 等于1的噩梦中走出来,dp[3] = dp[2] + 1 = 2; 

    当3加入时,我们可以观察到dp[4]前面一路顺风顺水,到了dp[3]还是等于2,遍历到数字5时,并不满足条件,故dp[4] 仍然等于2;

    同理7加入时候,dp[4]等于2,但是到了dp[5]这个关键点,如果再不出现nums[j] < nums[i],肯定dp[5]还是老样子。但是当发现3 < 7时,dp[5] = dp[4] + 1 = 3,dp[5]终于前进一步。

  • 相关阅读:
    vue2 v-model/v-text 中使用过滤器的方法示例
    HTML5游戏开发案例教程合集
    Docker实战案例视频课程
    Java项目框架架构与优化教程
    Linux云计算-虚拟化技术视频教程
    udl
    Chloe官网及基于NFine的后台源码毫无保留开放
    抽象类存在的意义和作用
    Shell 脚本语法
    Github 高级搜索功能
  • 原文地址:https://www.cnblogs.com/theWinter/p/10544589.html
Copyright © 2011-2022 走看看