2025 年第 33 题阅读程序动态规划提高
程序(三):a=1..n 时代码等价于什么问题
题目
阅读下面的程序,回答问题。 int f[5007][5007]; int a[5007], b[5007]; int n; int main(){ scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); for (int i = 1; i <= n; ++i) scanf("%d", &b[i]); for (int i = 1; i <= n; ++i){ for (int j = 1; j <= n; ++j){ f[i][j] = std::max(f[i - 1][j], f[i][j - 1]); if (a[i] == b[j]) f[i][j] = std::max(f[i][j], f[i - 1][j - 1] + 1); } } printf("%d\n", f[n][n]); } 如果输入的 a 数组是 1,2,...,n,而且 b 数组中数字均为 1~n 中的正整数,则上述代码等价于下面哪个问题:( )
考点拆解
经典二维 LCS(最长公共子序列)动态规划
f[i][j]=max(f[i-1][j],f[i][j-1]),若 a[i]==b[j] 再与 f[i-1][j-1]+1 取最大
易错提醒
遇到 LCS 代码但其中一个数组恰好是 1..n 的连续整数时,要联想到它可能是 LIS 问题的另一种实现
阅读程序题要按变量变化顺序手推,不要跳步
选择题要检查单位、边界和题目中的否定词