2025 年第 31 题阅读程序动态规划提高
程序(三):输出结果满足的性质
题目
阅读下面的程序,回答问题。 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]); } 输出的答案满足的性质有( )
考点拆解
经典二维 LCS(最长公共子序列)动态规划
f[i][j]=max(f[i-1][j],f[i][j-1]),若 a[i]==b[j] 再与 f[i-1][j-1]+1 取最大
易错提醒
阅读程序题要按变量变化顺序手推,不要跳步
选择题要检查单位、边界和题目中的否定词