最长递增子序列问题--动态规划解法

1.问题描述

求一个由n个整数组成的整数序列的最长递增子序列。一个整数序列的递增子序列可以是序列中非连续的数按照原序列顺序排列而成的。 最长递增子序列是其递增子序列中长度最长的。

2. 具体要求(若在ACM平台上提交程序,必须按此要求)――平台上1700题

输入:输入的第一行是一个正整数n,表示测试例个数。接下来几行是n个测试例的数据,每个测试例的数据由两行组成,其中第一行为一个正整数k (k<=500),表示整数序列的长度,第二行给出整数序列,整数之间用一个空格隔开。(设给出的每个整数序列的最长递增子序列都是唯一的。)

输出:对于每个测试例输出两行,第一行为最长递增子序列的长度,第二行为最长递增子序列,整数之间用一个空格隔开。两个测试例的输出数据之间用一个空行隔开,最后一个测试例后无空行。

3. 测试数据

输入:2

5

3 1 4 2 3

6

1 3 9 5 2 6

20

1 2 7 13 3 5 10 24 12 4 9 16 53 6 83 8 23 11 31 47

输出:3

1 2 3

    

4

1 3 5 6

 

10

1 2 3 5 10 12 16 23 31 47

在碰到这个问题的时候自己没有想到好的方法,百度上找的好像都只有返回序列长度没有返回序列列表,在https://www.cnblogs.com/coffy/p/5878915.html中的第三个算法上改进,完成作业!

代码如下:       

def find(arr):
    if(len(arr) == 1):
        return arr
    else:
        length = len(arr)
        Len = [0] * length
        Len[0] = 1
        for i in range(length):
            for j in range(i):
                if arr[j] < arr[i] and Len[j] + 1 > Len[i]:
                    Len[i] = Len[j] + 1
        max1 = max(Len)
        result = []
        for i in range(length-1, -1, -1):
            if(Len[i]==max1):
                result.append(arr[i])
                max1 -= 1            
        return result
    
n = int(input('输入n:'))
while n>0:
    m = int(input('输入m:'))
    arr = list(map(int, input('输入arr[]:').split()))
    arr = [value for value in arr[0:m]]
    result = find(arr)
    result.reverse()
    for value in result:
        print(value, end=' ')
    print()
    n-=1

   时间复杂度O(n²)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值