zoukankan      html  css  js  c++  java
  • Leetcode中级算法-动态规划03(最长上升子序列)

    最长上升子序列(LIS)的定义:

       一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).

    三种求解方法:

    1. O(n^2)的DP
    2. O(nlogn)的二分+贪心法
    3. O(nlogn)的树状数组优化的DP
    

    题目:Longest Increasing Subsequence

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

    示例:

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

    可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
    你算法的时间复杂度应该为 O(n2) 。
    进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

    感性思路:简单DP,不一样的配方,一样的套路。想要求得最长上升子序列的长度,来源只有一种——前一个最长上升子序列的长度+1 ,据此就得到了状态转移方程 。

    如何实现:用F[i] 来表示该位置最长上升子序列的长度,那么我们就扫描i之前的元素,如果前面的元素比nums[i]小,我们就让该位置的长度=前面最大的最长上升子序列的长度加1,即“F[i]=max{F[j]+1}( 0< j < i, A[j] < A[i] )” 。需要注意的是必须是前面的最大的最长上升子序列的长度加1 !!! 比如:

    1, 3, 6, 7, 9, 4, 10, 5, 6
    

    对应的 F[ i ] 是:

    1,2,3,4,5,3,  x
    

    当算到 x 的时候,如果不是前面的最大的最长上升子序列的长度加1的话x的位置就会变成4,这是我们所不希望的 。

    1. O(n^2)的DP

    #include<iostream>
    #include<vector>
    using namespace std ;
    class Solution {
    public:
        int lengthOfLIS(vector<int>& nums) {
            int TT = nums.size()  ;
            if( TT == 0)
                return 0;
            vector<int> F(TT,1);
            for (int i = 0; i < TT ; ++i)
            {
                for (int j = 0; j < i ; ++j )
                {
                    if(nums[j] < nums[i]  ){
                        //这里需要注意一下
                        F[i] = max(F[j] + 1 ,F[i]);
                    }       
                }
            }
            int max =  F[0] ;
            for(auto i:F ){
                if(i > max )
                    max =  i ;
            }
            return max  ;
        }
    };

    2. O(nlogn)的二分+贪心法(暂略)

    3. O(nlogn)的树状数组优化的DP(暂略)

    参考链接:
    https://blog.csdn.net/George__Yu/article/details/75896330

  • 相关阅读:
    虚函数和纯虚函数
    MS CRM 2011中PartyList类型字段的实例化
    MS CRM 2011的自定义与开发(12)——表单脚本扩展开发(4)
    MS CRM 2011的自定义与开发(12)——表单脚本扩展开发(2)
    MS CRM 2011的自定义和开发(10)——CRM web服务介绍(第二部分)——IOrganizationService(二)
    MS CRM 2011 SDK 5.08已经发布
    MS CRM 2011 Q2的一些更新
    最近很忙
    Microsoft Dynamics CRM 2011最近的一些更新
    补一篇,Update Rollup 12 终于发布了
  • 原文地址:https://www.cnblogs.com/Tattoo-Welkin/p/10335272.html
Copyright © 2011-2022 走看看