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

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

国际空间研究组织 | ISRO CS 2008 |问题 18

题目描述

给定一个由每个元素表示在该位置结束的最长递增子序列长度的数组(LIS)arr [],程序员需要计算使用给定的数组作为最长公共递增子序列(LCIS)的两个数组的长度。 注意,LCIS的两个数组在其中的元素不必按其原始顺序来自源数组。

输入格式

第一行包含一个整数T,表示测试用例的数量。每个测试用例都包含3行。第一行包含一个整数N,表示一个数组的长度。下一行包含N个以空格分隔的整数,表示LIS数组。 最后一行包含N个以空格分隔的整数,表示第一个输入数组的元素。

输出格式

对于每个测试用例,打印由两个数组的元素组成的最长公共递增子序列的长度。在单独的行中打印输出。

示例

输入:

2
3
1 2 3
3 2 1 
4
10 22 9 33
50 40 10 20

输出:

1
2
解题思路

本题是一道动态规划问题。

首先,我们可以使用两个数组L1[]和L2[]来表示给定的两个数组的元素,然后我们可以使用一个大小为[N + 1] * [N + 1]的二维数组LCIS[][]来存储长度为i和j的最长公共子序列的长度。为了确定LCIS的i和j的值,我们可以使用以下递归公式:

         / 0                                           如果i == 0或j == 0
LCIS[i][j]
         \ LCIS[i-1][j-1] + 1                           如果L1[i-1] == L2[j-1]
         \ max(LCIS[i-1][j], LCIS[i][j-1])              否则

这就是LCIS的递归公式。

有了LCIS的连续递增子序列长度之后,就可以求出LCIS的长度。

代码实现

使用Python语言,代码如下:

def compute_lc_length(n, arr1, arr2):
    lcis = [[0 for j in range(n + 1)]for i in range(n + 1)]
    for i in range(n + 1):
        for j in range(n + 1):
            if i == 0 or j == 0:
                lcis[i][j] = 0
            elif arr1[i - 1] == arr2[j - 1]:
                lcis[i][j] = lcis[i - 1][j - 1] + 1
            else:
                lcis[i][j] = max(lcis[i][j - 1], lcis[i - 1][j])
    return lcis[n][n]


def main():
    t = int(input())
    for _ in range(t):
        n = int(input())
        lis = list(map(int, input().split()))
        arr = list(map(int, input().split()))
        print(compute_lc_length(n, lis, arr))


if __name__ == "__main__":
    main()
代码说明

第1行中的“def compute_lc_length(n, arr1, arr2):”定义了计算LCIS长度的函数。该函数使用三个参数,即测试用例中描述的四个数组的长度n,以及两个输入数组arr1和arr2。

第2 - 7行是行和列的个数为n + 1的LCIS数组,它将存储与arr1和arr2关联的LCIS长度。

第8 - 13行是LCIS递归公式的实现。

第15 - 20行是主函数,它处理输入,调用compute_lc_length()函数并输出结果。