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

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值