题型:组合题
#include <algorithm>
#include <cstdio>
#include <cstring>
#define ll long long
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]);
}
// 动态规划计算最长公共子序列(LCS)
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]);
// 若当前元素相等,则可以从左上角+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]);
return 0;
}如果在16行的循环前加上以下两行:“std::sort(a+1,a+n+1);std::sort(b+1,b+n+1)”,则答案会()。
| A. 变大或不变 |
B. 变小或不变 |
| C. 一定变大 |
D. 不变 |
当输入“4 1 2 3 4 1 3 2 2”时,输出为2。()
| A.正确 | B.错误 |
当程序运行完毕后,对于所有的1≤i,j≤n,都一定有f[i][i]<=f[n][n]。()
| A.正确 | B.错误 |
输出的答案满足的性质有()。
| A. 小于等于n |
B. 大于等于0 |
| C. 不一定大于等于1 |
D. 以上均是 |
将第18行的“[i][i]=std::max(f[i]D),std:max(f[i-1][i],f[i]D-1)));”删去后,并不影响程序运行结果。()
| A.正确 | B.错误 |
如果输入的a={1,2,…,n},而且b数组中数字均为1~n中的正整数,则上述代码等价于下面哪个问题:()。
| A. 求b数组去重后的长度 |
B. 求b数组的最长上升子序列 |
| C. 求b数组的长度 |
D. 求b数组的最大值 |
更新时间:2025-10-15 11:45:37
|
【知识点】
CCF非专业级别软件能力认证CSP-J/入门级
抱歉! 您未登录, 不能查看答案和解析点击登录











