最长递增子序列
题目描述
给出一个序列a1,a2,a3,a4,a5,a6,a7...an,求它的一个子序列(设为s1,s2,...sn),使得这个子序列满足这样的性质:s1<s2<s3<...<sn并且这个子序列的长度最长。输出这个最长子序列的长度,要求时间复杂度为O(n2)。
输入
每组输入包括两行,第一行为序列长度n,第二行为序列。
输出
输出最长递增子序列的长度。
样例输入 Copy
7 1 7 3 5 9 4 8
样例输出 Copy
4
求解递增子序列长度的函数:def getdp(testlist):#写一个求解递增子序列的函数 n=len(testlist)#test为输入的序列 dp=[0]*n#初始化保存递增子序列长度的数组 for i in range(n):#从后往前看 dp[i]=1#取出列表中的一个数,长度赋值为1 for j in range(i):#从前往后遍历teslist【i】之前的数 if testlist[i]>testlist[j]:#如果发现比testlist[i]小的,则更新dp【i】 dp[i]=max(dp[i],dp[j]+1) return dp
输入输出:
while True: try: n=int(input()) testlist=list(map(int,input().split())) print(max(getdp(testlist))) except EOFError: break
全部代码:
def getdp(testlist):#写一个求解递增子序列的函数 n=len(testlist)#test为输入的序列 dp=[0]*n#初始化保存递增子序列长度的数组 for i in range(n):#从后往前看 dp[i]=1#取出列表中的一个数,长度赋值为1 for j in range(i):#从前往后遍历teslist【i】之前的数 if testlist[i]>testlist[j]:#如果发现比testlist[i]小的,则更新dp【i】 dp[i]=max(dp[i],dp[j]+1) return dp while True: try: n=int(input()) testlist=list(map(int,input().split())) print(max(getdp(testlist))) except EOFError: break
根据示例的输入输出更新dp表的过程: