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²)