深耕专业教研,探索前沿技术
信息技术来源:金丽衢十二校2025学年高三第二次联考

第 12 题

答案与解析

本题解析

参考答案

C

程序分析

a = [9, 7, 5, 8, 4, 6, 3, 2]
n = 8
num = [0] * n
i = 0
while i < n:
    num[i] = 1
    for j in range(0, i):
        if a[j] > a[i] and num[j] >= num[i]:
            num[i] = num[j] + 1
    i = i + 1

程序按下标从左到右处理 a,每轮先将 num[i] 设为 1,再考察所有 j<i 的位置。
条件 a[j]>a[i] 表示 a[i] 可以接在 a[j] 后面,继续保持严格递减;更新 num[i]=num[j]+1,则是在已有序列后接上当前元素,长度增加 1。初值 1 对应只包含 a[i] 自身的序列。
num[j]≥num[i] 等价于 num[j]+1>num[i],只有接上后能得到更长序列才更新。由于 j<i,前面位置的 num[j] 已经求出;内层循环结束时,num[i] 就是以 a[i] 结尾的最长严格递减子序列长度。这里保留原数组中的先后次序,但元素不要求连续。

ans = 0
for i in range(n):
    if num[i] > ans:
        ans = num[i]
print(ans)

循环在 num[i] 大于当前 ans 时更新 ans,最终取得 num 的最大值,也就是在所有可能的结尾中选择最长者,输出整个数组的最长严格递减子序列长度。

计算当前 num[i] 时,在左侧比 a[i] 大的元素中选取最大的 num[j],再加 1;若没有这样的元素,则保留初值 1。

i a[i] 可接在前面的最大 num[j] num[i]
0 9 无 1
1 7 1 2
2 5 2 3
3 8 1 2
4 4 3 4
5 6 2 3
6 3 4 5
7 2 5 6

例如处理 6 时,左侧能接在它前面的数是 9、7、8,对应长度分别为 1、2、2,所以此处最长长度为 3,不能沿用以 4 结尾的长度。
最终 num 的最大值为 6,对应的一条递减子序列是 9、7、5、4、3、2,程序输出 6。