深耕专业教研,探索前沿技术
信息技术来源:镇海中学2026年5月高三高考模拟考试

第 12 题

答案与解析

本题解析

参考答案

A

程序分析

n = len(a)
b = [0] * n
for i in range(n):
    for j in range(i):
        if a[i] > a[j]:
            b[i] = max(b[i], b[j] + 1)
print(b[n - 1])

b 的各项初值为 0。外层循环从左到右处理 a[i],内层循环检查它前面的 a[j]。只有 a[j]<a[i] 时,才允许在以 a[j] 结尾的递增子序列后接上 a[i],并用 b[j]+1 更新 b[i];max 保留所有接法中的最大值。由于只含 a[i] 自身时 b[i]=0,而每接入一个更大的元素数值增加 1,所以 b[i] 表示以 a[i] 结尾的最长严格递增子序列长度减 1。子序列须保持原下标顺序,但不要求相邻。最后输出 b[9],因此只考虑以末尾的 7 结尾的递增子序列。

表中 0 表示待恢复的元素,缺失的四个数是 1、2、5、6,应填在下标 2 至 5 处。末尾是 7,前面的 8、9、10 都不能进入以 7 结尾的递增子序列。

分两种情况确定长度上限:

  • 若选用开头的 4 或 3,由于 4 在 3 前面且 4>3,二者最多选一个;后面的 1、2 比它们小,也不能接入,最多再接上 5、6、7,长度不超过 4。
  • 若不选开头的 4、3,最多选取四个缺失数并接上末尾的 7,长度不超过 5。将缺失位置依次填为 1、2、5、6,就能得到子序列 1、2、5、6、7,达到长度 5。

因此最长长度的最大可能值为 5,程序输出的是长度减 1,最大为 4。