📌  相关文章
📜  国际空间研究组织 | ISRO CS 2011 |问题 57(1)

📅  最后修改于: 2023-12-03 14:50:46.617000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2011 |问题 57

这是国际空间研究组织在2011年的招聘考试中出现的第57题。

题目描述

给定一个长度为N的无序数组A,输出满足以下条件的最长子序列的长度L:

  1. 子序列中的所有元素都不相同。
  2. 子序列中的最后一个元素等于A[N-1]。
  3. 子序列中的所有元素都在A中按照出现顺序不早于A[N-1]。
输入描述

第一行包含一个整数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的格式要求。