算法导论第15章练习题 15.4-5

来源:互联网 发布:讲课软件 编辑:程序博客网 时间:2024/06/01 09:47

15.4-5设计一个O(n²)时间的算法,求一个n个数的序列的最长单调递增子序列。

第一种:对序列进行排序,排序之后得到序列b与原来的序列a,求最长公共子串。(排序之前先将原来序列中的重复元素删掉(保证公共子串递增)b中无重复元素,a保持原来不变)

 

第二种:

def longestIncreasingSubsequence(self, nums):

        # write your code here

        l=[0]*(len(nums)+1)

        l[0]=0

        for i in range(0,len(nums)):

            l[i+1]=1

            for j in range(0,i):

                if nums[j]<nums[i] and l[j+1]+1>l[i+1] :

                    l[i+1]=l[j+1]+1

        max=l[0]

        for i in range(1,len(l)):

            if l[i]>max:

                max=l[i]

        return max

动态规划:length数组存最长上升子序列的长度,length[i]表示以  原始数组nums[i]为子序列最右元素时   的最长上升子序列长度(涵盖所有可能)。当原始序列长度为0时,length[0]=0.  当原始序列长度为1时,length[1]=1.对于nums[2...n]中的nums[i],每个最大上升子序列长度 ,至少为1(只有自己),所以初始化为1.对于前面的每个元素nums[j],若该值小于nums[i],那么length[i]等于length[j]+1.遍历前面的所有数,即可得到最大的length[i].

最后可求得所有的length[i].取其中最大者即可。


参考 http://blog.csdn.net/zhangyx_xyz/article/details/50949957

   http://blog.csdn.net/z84616995z/article/details/38011391