csppass
连续 00 XP登录 / 注册
202532阅读程序动态规划提高

程序(三):给 a、b 都排序后答案的变化

题目

阅读下面的程序,回答问题。 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]); } 如果在双重循环开始前加上以下两行:std::sort(a+1,a+n+1); std::sort(b+1,b+n+1);,则答案会( )

考点拆解
经典二维 LCS(最长公共子序列)动态规划
f[i][j]=max(f[i-1][j],f[i][j-1]),若 a[i]==b[j] 再与 f[i-1][j-1]+1 取最大
易错提醒
阅读程序题要按变量变化顺序手推,不要跳步
选择题要检查单位、边界和题目中的否定词