📅  最后修改于: 2023-12-03 14:50:46.617000             🧑  作者: Mango
这是国际空间研究组织在2011年的招聘考试中出现的第57题。
给定一个长度为N的无序数组A,输出满足以下条件的最长子序列的长度L:
第一行包含一个整数T,表示测试用例的数量。 每个测试用例的第一行包含一个整数N,表示数组A的长度。 接下来一行包含N个空格分隔的整数,表示数组A中的元素。
对于每个测试用例,请输出一个整数L,表示符合条件的最长子序列的长度。
2
6
5 6 1 2 3 4
5
1 2 3 4 5
3
5
我们从后往前扫描数组A,同时用另一个数组dp记录以当前元素为结尾的最长符合条件的子序列长度。具体来说,我们对于每个i从N-2到0,递减地扫描A,找到第一个不小于A[i]的元素 A[j],就更新dp[i]=max(dp[i],dp[j]+1)。
最后在dp数组中找到最大值即为答案。
时间复杂度为O(N^2)。
def longest_subsequence(lst):
n = len(lst)
dp = [1 for _ in range(n)]
for i in range(n - 2, -1, -1):
for j in range(i + 1, n):
if lst[j] >= lst[i]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
if __name__ == '__main__':
T = int(input())
for _ in range(T):
n = int(input())
lst = list(map(int, input().split()))
print(longest_subsequence(lst))
代码片段中输入输出的格式满足Markdown的格式要求。