林老师 · 客观题题库 · 专题 17 动态规划入门 · 复习强化

专题 17 动态规划入门 · 复习强化

100 题 · 每题对应一个知识细节 · 全部原创
真题
复刻
试卷编号ORIG-专题17动态规划入门-复习强化
题目总数102 题 · 100 分
试卷类型客观题
考生须知:
① 本卷共 17 大部分,合计 102 题 · 100 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 100 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

DP 基本概念

7 QUESTIONS · 2 POINTS EACH
第 1 题 A1 未作答

动态规划解决问题的基本方式是( )。

(1 分)
第 2 题 A2 未作答

DP 中「状态」与「转移」分别指( )。

(1 分)
第 3 题 A3 未作答

DP 的初始化(边界值)的作用是( )。

(1 分)
第 4 题 A4 未作答

动态规划与贪心法的本质区别是( )。

(1 分)
第 5 题 A5 未作答

DP 与递推的关系,最准确的说法是( )。

(1 分)
第 6 题 A6 未作答

写一道 DP 题的标准流程依次是( )。

(1 分)
第 7 题 A7 未作答

一个问题能用 DP 求解,需要的两个关键性质是( )。

(1 分)

一维 DP 经典

8 QUESTIONS · 2 POINTS EACH
第 8 题 B1 未作答

爬楼梯每次上 1122 阶,走到第 nn 阶的方案数 f[n]f[n] 满足( )。

(1 分)
第 9 题 B2 未作答

最大子段和的状态设计 f[i]f[i] 表示( )。

(1 分)
第 10 题 B3 未作答

数字三角形求从顶到底最大路径和,状态 f[i][j]f[i][j] 通常定义为( )。

(1 分)
第 11 题 B4 未作答

m×nm\times n 网格只向右或向下走,从左上角到右下角的路径数,转移方程是( )。

(1 分)
第 12 题 B5 未作答

从一列数中取若干个,要求任意两个取出的数在原序列中不相邻,求取出的数之和最大。状态 f[i]f[i] 应定义为( )。

(1 分)
第 13 题 B6 未作答

爬台阶每阶有一个花费,每次可跨 1122 阶,可从第 0011 阶起跳,求到达顶部的最小花费。转移应取( )。

(1 分)
第 14 题 B7 未作答

最长上升子序列(LIS)指的是( )。

(1 分)
第 15 题 B8 未作答

f[i]f[i] 只依赖 f[i1]f[i-1]f[i2]f[i-2] 时,可以用两三个变量滚动代替整个数组,其依据是( )。

(1 分)

01 背包概念

7 QUESTIONS · 2 POINTS EACH
第 16 题 C1 未作答

01 背包(nn 件物品,每件最多选一次,容量 CC)的状态 f[i][j]f[i][j] 通常定义为( )。

(1 分)
第 17 题 C2 未作答

01 背包的转移方程 f[i][j]=max(f[i1][j], f[i1][jwi]+vi)f[i][j] = \max(f[i-1][j],\ f[i-1][j-w_i] + v_i),其中两项分别表示( )。

(1 分)
第 18 题 C3 未作答

一维 01 背包的容量循环必须从大到小(倒序),原因是( )。

(1 分)
第 19 题 C4 未作答

要求背包「恰好装满」容量 CC 时的最大价值,初始化应写成( )。

(1 分)
第 20 题 C5 未作答

若只要求「总重量不超过 CC」的最大价值,初始化应为( )。

(1 分)
第 21 题 C6 未作答

统计「恰好用满容量」的装法数,转移方程是( )。

(1 分)
第 22 题 C7 未作答

为什么 01 背包不能按「单位价值最高先装」的贪心做( )。

(1 分)

二维 DP 概念

7 QUESTIONS · 2 POINTS EACH
第 23 题 D1 未作答

网格类问题的二维状态 f[i][j]f[i][j] 一般表示( )。

(1 分)
第 24 题 D2 未作答

矩阵每格有一个数,从左上角走到右下角(只右/下),求路径数字和最大。转移为( )。

(1 分)
第 25 题 D3 未作答

「只向右或向下走」的二维 DP,格子 (i,j)(i,j) 的答案来自( )。

(1 分)
第 26 题 D4 未作答

二维路径 DP 中首行与首列要单独初始化,原因是( )。

(1 分)
第 27 题 D5 未作答

网格中有障碍格(不可通行)时,路径计数 DP 的处理方式是( )。

(1 分)
第 28 题 D6 未作答

m×nm\times n 网格、每格转移 O(1)O(1) 的二维 DP,时间复杂度是( )。

(1 分)
第 29 题 D7 未作答

f[i][j]f[i][j] 只依赖本行与上一行时,可以把二维数组压成一维,其原理是( )。

(1 分)

LIS 专题

6 QUESTIONS · 2 POINTS EACH
第 30 题 E1 未作答

最长上升子序列中「上升」指严格递增(aj<aia_j < a_i)。若允许相等(ajaia_j \le a_i),得到的是( )。

(1 分)
第 31 题 E2 未作答

LIS 的转移方程 f[i]=max(f[j]+1)f[i] = \max(f[j] + 1)j<ij<iaj<aia_j < a_i)中,f[i]f[i] 表示( )。

(1 分)
第 32 题 E3 未作答

按「结尾」定义算完所有 f[i]f[i] 后,LIS 的最终答案是( )。

(1 分)
第 33 题 E4 未作答

要输出 LIS 的具体序列(不只是长度),标准做法是( )。

(1 分)
第 34 题 E5 未作答

「子序列」与「子段」的区别是( )。

(1 分)
第 35 题 E6 未作答

LIS 长度可能由多条不同的子序列达到。统计方案数时,转移遇到 f[j]+1=f[i]f[j]+1 = f[i] 应执行( )。

(1 分)

DP 与其它算法

5 QUESTIONS · 2 POINTS EACH
第 36 题 F1 未作答

DP 与分治都划分子问题,关键差别是( )。

(1 分)
第 37 题 F2 未作答

回溯枚举所有方案与 DP 求最优的对比,正确的是( )。

(1 分)
第 38 题 F3 未作答

DP 的时间复杂度通常按( )估算。

(1 分)
第 39 题 F4 未作答

「求最长的简单路径」不能直接 DP,因为( )。

(1 分)
第 40 题 F5 未作答

初学 DP 最常见的三类错误是( )。

(1 分)

实战细节

6 QUESTIONS · 2 POINTS EACH
第 41 题 G1 未作答

设计 DP 状态时的「三问」是( )。

(1 分)
第 42 题 G2 未作答

DP 循环顺序的确定原则是( )。

(1 分)
第 43 题 G3 未作答

DP 算完后「去哪里取答案」,正确的认识是( )。

(1 分)
第 44 题 G4 未作答

DP 数组的大小应按( )开。

(1 分)
第 45 题 G5 未作答

转移中 jwij-w_ii1i-1 这类下标计算要保证( )。

(1 分)
第 46 题 G6 未作答

DP 调试的首选手段是( )。

(1 分)

易错综合

5 QUESTIONS · 2 POINTS EACH
第 47 题 H1 未作答

一维 01 背包把容量循环写成正序,直接后果是( )。

(1 分)
第 48 题 H2 未作答

「恰好装满」问题把 f[j]f[j] 全初始化为 00,后果是( )。

(1 分)
第 49 题 H3 未作答

转移方程漏写「不选第 ii 件」的分支(只保留选的分支),后果是( )。

(1 分)
第 50 题 H4 未作答

LIS 算完后误把 f[n]f[n](最后一项结尾的值)当成答案,可能出错的原因是( )。

(1 分)
第 51 题 H5 未作答

关于动态规划,下列说法正确的是( )。

(1 分)

一维 DP 代码

7 QUESTIONS · 2 POINTS EACH
第 52 题 I1 未作答

01int f[20];
02f[1] = 1; f[2] = 2;
03for (int i = 3; i <= 5; i++)
04    f[i] = f[i - 1] + f[i - 2];
05cout << f[5];

输出是( )。

(1 分)
第 53 题 I2 未作答

01int a[] = {-2, 3, -1, 2, -5};
02int f[5];
03f[0] = a[0];
04for (int i = 1; i < 5; i++)
05    f[i] = max(f[i - 1] + a[i], a[i]);
06int mx = f[0];
07for (int i = 1; i < 5; i++) mx = max(mx, f[i]);
08cout << mx;

输出是( )。

(1 分)
第 54 题 I3 未作答

01// 三角形:7 / 3 8 / 8 1 0 / 2 7 4 4
02int f[4][4];
03for (int j = 0; j < 4; j++) f[3][j] = tri[3][j];
04for (int i = 2; i >= 0; i--)
05    for (int j = 0; j <= i; j++)
06        f[i][j] = tri[i][j] + max(f[i + 1][j], f[i + 1][j + 1]);
07cout << f[0][0];

输出是( )。

(1 分)
第 55 题 I4 未作答

01int f[3][3];
02f[0][0] = 1;
03for (int i = 0; i < 3; i++)
04    for (int j = 0; j < 3; j++) {
05        if (i == 0 && j == 0) continue;
06        int up = (i > 0) ? f[i - 1][j] : 0;
07        int lf = (j > 0) ? f[i][j - 1] : 0;
08        f[i][j] = up + lf;
09    }
10cout << f[2][2];

输出是( )。

(1 分)
第 56 题 I5 未作答

01int a[] = {3, 1, 4, 1, 5};
02int f[5];
03for (int i = 0; i < 5; i++) {
04    f[i] = a[i];
05    for (int j = 0; j + 2 <= i; j++)
06        f[i] = max(f[i], f[j] + a[i]);
07}
08int mx = 0;
09for (int i = 0; i < 5; i++) mx = max(mx, f[i]);
10cout << mx;

输出是( )。

(1 分)
第 57 题 I6 未作答

01int a = 1, b = 1;
02for (int i = 3; i <= 10; i++) {
03    int c = a + b;
04    a = b;
05    b = c;
06}
07cout << b;

输出是( )。

(1 分)
第 58 题 I7 未作答

01// cost[] = {10, 15, 20},从第 0 或 1 阶起跳,每次跨 1 或 2 阶,跳离时支付该阶费用
02int f[4];
03f[0] = 0;
04f[1] = cost[0];
05for (int i = 2; i <= 3; i++)
06    f[i] = min(f[i - 1] + cost[i - 1], f[i - 2] + cost[i - 2]);
07cout << f[3];

输出是( )。

(1 分)

LIS 代码

6 QUESTIONS · 2 POINTS EACH
第 59 题 J1 未作答

01int a[] = {3, 1, 4, 1, 5, 9, 2, 6};
02int f[8];
03for (int i = 0; i < 8; i++) {
04    f[i] = 1;
05    for (int j = 0; j < i; j++)
06        if (a[j] < a[i]) f[i] = max(f[i], f[j] + 1);
07}
08int mx = 0;
09for (int i = 0; i < 8; i++) mx = max(mx, f[i]);
10cout << mx;

输出是( )。

(1 分)
第 60 题 J2 未作答

01int a[] = {1, 3, 2, 4};
02int f[4];
03for (int i = 0; i < 4; i++) {
04    f[i] = 1;
05    for (int j = 0; j < i; j++)
06        if (a[j] < a[i]) f[i] = max(f[i], f[j] + 1);
07}
08for (int i = 0; i < 4; i++) cout << f[i] << " ";

输出是( )。

(1 分)
第 61 题 J3 未作答

01// a = {1, 3, 2, 2, 4},判断条件用 a[j] <= a[i]
02int f[5];
03for (int i = 0; i < 5; i++) {
04    f[i] = 1;
05    for (int j = 0; j < i; j++)
06        if (a[j] <= a[i]) f[i] = max(f[i], f[j] + 1);
07}
08// 输出 f 的最大值

输出是( )。

(1 分)
第 62 题 J4 未作答

01// a = {5, 3, 4, 2, 1},判断条件用 a[j] > a[i]
02int f[5];
03for (int i = 0; i < 5; i++) {
04    f[i] = 1;
05    for (int j = 0; j < i; j++)
06        if (a[j] > a[i]) f[i] = max(f[i], f[j] + 1);
07}
08// 输出 f 的最大值

输出是( )。

(1 分)
第 63 题 J5 未作答

序列 a = {2, 5, 3, 7} 求 LIS 时记录了来源数组 pre = {-1, 0, -1, 1}pre[i]f[i] 的最优来源下标,无来源记 1-1),最长链的结尾在下标 33。沿 pre 回溯收集元素,还原出的 LIS 是( )。

(1 分)
第 64 题 J6 未作答

对序列 {1, -2, 3, 4, -1} 分别求:最长严格上升子序列长度、最大子段和,两个结果分别是( )。

(1 分)
拾壹

背包代码

7 QUESTIONS · 2 POINTS EACH
第 65 题 K1 未作答

01// w = {2, 3, 4, 5}, v = {3, 4, 5, 6}, C = 8
02int f[9];
03memset(f, 0, sizeof(f));
04for (int i = 0; i < 4; i++)
05    for (int j = 8; j >= w[i]; j--)
06        f[j] = max(f[j], f[j - w[i]] + v[i]);
07cout << f[8];

输出是( )。

(1 分)
第 66 题 K2 未作答

01// w = {2, 3, 4, 5}, v = {3, 4, 5, 6}, C = 8
02int f[9];
03memset(f, 0, sizeof(f));
04for (int i = 0; i < 4; i++)
05    for (int j = w[i]; j <= 8; j++)   // 容量循环误写成正序
06        f[j] = max(f[j], f[j - w[i]] + v[i]);
07cout << f[8];

结果是( )。

(1 分)
第 67 题 K3 未作答

物品重量 w = {2, 3, 4}、价值 v = {3, 4, 5}、容量 C=5C = 5。恰好装满模型下 f[0]=0f[0] = 0、其余 f[j]f[j] 初值为负无穷(不可达标记),标准 01 背包倒序转移后输出 f[5]f[5],结果是( )。

(1 分)
第 68 题 K4 未作答

01// w = {1, 2, 3},统计恰好装满容量 3 的方案数
02int f[4];
03memset(f, 0, sizeof(f));
04f[0] = 1;
05for (int i = 0; i < 3; i++)
06    for (int j = 3; j >= w[i]; j--)
07        f[j] += f[j - w[i]];
08cout << f[3];

输出是( )。

(1 分)
第 69 题 K5 未作答

一维滚动背包 f[j] = max(f[j], f[j-w[i]] + v[i])(倒序)与二维表版的关系是( )。

(1 分)
第 70 题 K6 未作答

01// w = {2, 3, 4, 5}, v = {3, 4, 5, 6}, C = 8
02int f[5][9];
03memset(f, 0, sizeof(f));
04for (int i = 1; i <= 4; i++)
05    for (int j = 0; j <= 8; j++) {
06        f[i][j] = f[i - 1][j];
07        if (j >= w[i - 1])
08            f[i][j] = max(f[i][j], f[i - 1][j - w[i - 1]] + v[i - 1]);
09    }
10cout << f[4][8];

输出是( )。

(1 分)
第 71 题 K7 未作答

物品重量 w = {2, 3},恰好装满模型(f[0]=0f[0]=0,其余初值负无穷),容量 C=1C = 1,标准倒序转移后检查 f[1]f[1],其状态是( )。

(1 分)
拾贰

二维 DP 代码

6 QUESTIONS · 2 POINTS EACH
第 72 题 L1 未作答

01// 矩阵 a = {{1,2,3},{4,5,6},{7,8,9}},从左上角只右/下走到右下角
02int f[3][3];
03f[0][0] = a[0][0];
04for (int j = 1; j < 3; j++) f[0][j] = f[0][j - 1] + a[0][j];
05for (int i = 1; i < 3; i++) f[i][0] = f[i - 1][0] + a[i][0];
06for (int i = 1; i < 3; i++)
07    for (int j = 1; j < 3; j++)
08        f[i][j] = max(f[i - 1][j], f[i][j - 1]) + a[i][j];
09cout << f[2][2];

输出是( )。

(1 分)
第 73 题 L2 未作答

矩阵 a = {{1,2,3},{4,5,6},{7,8,9}},从左上角只右/下走的路径 DP。按边界初始化代码 f[0][j] = f[0][j-1] + a[0][j] 计算后,首行 f[0][0..2] 三个值是( )。

(1 分)
第 74 题 L3 未作答

01// 3x3 网格,(1,1) 为障碍(不可通行),f[障碍] = 0
02f[0][0] = 1;
03for (int i = 0; i < 3; i++)
04    for (int j = 0; j < 3; j++) {
05        if (i == 0 && j == 0) continue;
06        if (bad[i][j]) { f[i][j] = 0; continue; }
07        f[i][j] = (i > 0 ? f[i - 1][j] : 0) + (j > 0 ? f[i][j - 1] : 0);
08    }
09cout << f[2][2];

输出是( )。

(1 分)
第 75 题 L4 未作答

二维路径 DP 压成一维滚动数组逐行计算时,第 ii 行第 jj 列的更新要用到( )。

(1 分)
第 76 题 L5 未作答

同 L1 矩阵 {{1,2,3},{4,5,6},{7,8,9}} 的最大路径 DP,全部算完后 f[1][1]f[1][1] 的值是( )。

(1 分)
第 77 题 L6 未作答

矩阵最大路径和的转移横线处应填( )。

01int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
02int f[3][3];
03f[0][0] = a[0][0];
04for (int i = 0; i < 3; i++)
05    for (int j = 0; j < 3; j++) {
06        if (i == 0 && j == 0) continue;
07        f[i][j] = ______ + a[i][j];
08    }

(1 分)
拾叁

数字三角形代码

5 QUESTIONS · 2 POINTS EACH
第 78 题 M1 未作答

数字三角形 7 / 3 8 / 8 1 0 / 2 7 4 4 自底向上 DP,f[2][0]=8+max(f[3][0],f[3][1])f[2][0] = 8 + \max(f[3][0], f[3][1]) 的值是( )。

(1 分)
第 79 题 M2 未作答

数字三角形 7 / 3 8 / 8 1 0 / 2 7 4 4 自底向上 DP 算完后,f[1][0]f[1][0]f[1][1]f[1][1] 分别是( )。

(1 分)
第 80 题 M3 未作答

数字三角形记录最优路径,转移时应( )。

(1 分)
第 81 题 M4 未作答

数字三角形 7 / 3 8 / 8 1 0 / 2 7 4 4,把自底向上转移中的 max 换成 min(求最小路径和),结果是( )。

(1 分)
第 82 题 M5 未作答

自底向上数字三角形的转移横线处应填( )。

01int tri[4][4] = {{7}, {3, 8}, {8, 1, 0}, {2, 7, 4, 4}};
02int f[4][4];
03for (int j = 0; j < 4; j++) f[3][j] = tri[3][j];
04for (int i = 2; i >= 0; i--)
05    for (int j = 0; j <= i; j++)
06        f[i][j] = tri[i][j] + ______;

(1 分)
拾肆

完善程序

7 QUESTIONS · 2 POINTS EACH
第 83 题 N1 未作答

补全爬楼梯方案数的转移:

01int f[20];
02f[1] = 1; f[2] = 2;
03for (int i = 3; i <= n; i++)
04    f[i] = /* 1 */;

空位 /* 1 */ 处应填( )。

(1 分)
第 84 题 N2 未作答

补全 LIS 的内层转移:

01int f[N];
02for (int i = 0; i < n; i++) {
03    f[i] = 1;
04    for (int j = 0; j < i; j++)
05        if (a[j] < a[i])
06            f[i] = /* 1 */;
07}

空位 /* 1 */ 处应填( )。

(1 分)
第 85 题 N3 未作答

补全一维 01 背包的容量循环:

01for (int i = 0; i < n; i++)
02    for (int j = C; /* 1 */; j--)
03        f[j] = max(f[j], f[j - w[i]] + v[i]);

空位 /* 1 */ 处应填( )。

(1 分)
第 86 题 N4 未作答

补全自底向上数字三角形的行循环(4 行三角形):

01for (int j = 0; j < 4; j++) f[3][j] = tri[3][j];
02for (int i = /* 1 */; i >= 0; i--)
03    for (int j = 0; j <= i; j++)
04        f[i][j] = tri[i][j] + max(f[i + 1][j], f[i + 1][j + 1]);

空位 /* 1 */ 处应填( )。

(1 分)
第 87 题 N5 未作答

补全网格路径计数的转移:

01for (int i = 0; i < m; i++)
02    for (int j = 0; j < n; j++) {
03        if (i == 0 && j == 0) { f[i][j] = 1; continue; }
04        f[i][j] = /* 1 */;
05    }

空位 /* 1 */ 处应填( )。

(1 分)
第 88 题 N6 未作答

「恰好装满」背包的初始化横线处应填( )。

01const int NEG = -1e9;
02f[0] = 0;
03for (int j = 1; j <= C; j++)
04    f[j] = /* 1 */;

(1 分)
第 89 题 N7 未作答

补全网格路径计数的边界初始化(首行):

01f[0][0] = 1;
02for (int j = 1; j < n; j++)
03    f[0][j] = /* 1 */;

空位 /* 1 */ 处应填( )。

(1 分)
拾伍

综合应用

5 QUESTIONS · 2 POINTS EACH
第 90 题 O1 未作答

w = {1, 2, 3},容量 C=3C = 3。「恰好装满的最大价值」(价值等于重量)与「恰好装满的方案数」分别是( )。

(1 分)
第 91 题 O2 未作答

数字三角形各行为 73 -88 1 02 -7 4 4(含负数),自底向上按 max 转移算完输出 f[0][0]f[0][0],结果是( )。

(1 分)
第 92 题 O3 未作答

序列 a = {1, 3, 2},同时统计 LIS 的长度与达到该长度的方案数,两个结果分别是( )。

(1 分)
第 93 题 O4 未作答

矩阵 {{1,2,3},{4,5,6},{7,8,9}} 最大路径 DP 中,f[2][1]f[2][1] 的值是( )(右下角左邻格)。

(1 分)
第 94 题 O5 未作答

w = {2, 3},容量 C=4C = 4,恰好装满模型(f[0]=0f[0]=0 其余负无穷,价值等于重量),标准倒序转移后 f[4]f[4] 的值是( )。

(1 分)
拾陆

易错代码

6 QUESTIONS · 2 POINTS EACH
第 95 题 P1 未作答

下列说法正确的是( )。

(1 分)
第 96 题 P2 未作答

01// w = {2, 3}, v = {3, 4}, C = 4,f 全 0 起步
02for (int i = 0; i < 2; i++)
03    for (int j = w[i]; j <= 4; j++)   // 正序(错误示范)
04        f[j] = max(f[j], f[j - w[i]] + v[i]);
05cout << f[4];

输出是( )。

(1 分)
第 97 题 P3 未作答

01// w = {2}, v = {5}, C = 4,恰好装满模型却误把 f 全部初始化为 0
02for (int i = 0; i < 1; i++)
03    for (int j = 4; j >= w[i]; j--)
04        f[j] = max(f[j], f[j - w[i]] + v[i]);
05cout << f[4];

输出是( )。

(1 分)
第 98 题 P4 未作答

最大子段和转移误写成 f[i] = f[i - 1] + a[i](丢掉 max(..., a[i])),对 a = {-3, 5} 的影响是( )。

(1 分)
第 99 题 P5 未作答

一维背包循环写成 for (int j = 0; j <= C; j++) f[j] = max(f[j], f[j - w[i]] + v[i]);,其中的错误是( )。

(1 分)
第 100 题 P6 未作答

把「最长上升子序列」误做成「最长连续上升段」,对 a = {5, 1, 2, 0, 3} 的结果是( )。

(1 分)

真 题 演 练

2 QUESTIONS · 真题演练不计分
第 102~107 题 阅读程序 (共 0 分) 未作答

1  #include <iostream>
2  #include <vector>
3  using namespace std;
4 
5  int compute(vector<int>& cost) {
6    int n = cost.size();
7    vector<int> dp(n+1, 0);
8    dp[1] = cost[0];
9    for (int i = 2; i <= n; i++) {
10      dp[i] = min(dp[i-1], dp[i-2]) + cost[i-1];
11    }
12    return min(dp[n], dp[n-1]);
13  }
14 
15  int main() {
16    int n;
17    cin >> n;
18    vector<int> cost(n);
19    for (int i = 0; i < n; i++) {
20      cin >> cost[i];
21    }
22    cout << compute(cost) << endl;
23    return 0;
24  }

102.

当输入的 cost 数组为 {10, 15, 20} 时,程序的输出为 15。( )

103.

如果将 dp[i-1] 改为 dp[i-3],程序可能会产生编译错误。( )

104.

程序总是输出 cost 数组中最小的元素。( )

105.

当输入的 cost 数组为 {1, 100, 1, 1, 1, 100, 1, 1, 100, 1} 时,程序的输出为( )。

106.

如果输入的 cost 数组为 {10, 15, 30, 5, 5, 10, 20},程序的输出为( )。

107.

若将代码中的 min(dp[i-1], dp[i-2]) + cost[i-1] 修改为 dp[i-1] + cost[i-2],输入 cost 数组为 {5, 10, 15} 时,程序的输出为( )。

CSP-J 2024 · 阅读程序 第21-26题 | 知识点 插入排序、数组越界
第 109~114 题 阅读程序 (共 0 分) 未作答

1  #include <algorithm>
2  #include <iostream>
3  #include <limits>
4 
5  using namespace std;
6 
7  const int MAXN = 105;
8  const int MAXK = 105;
9 
10  int h[MAXN][MAXK];
11 
12  int f(int n, int m)
13  {
14      if (m == 1) return n;
15      if (n == 0) return 0;
16 
17      int ret = numeric_limits<int>::max();
18      for (int i = 1; i <= n; i++)
19          ret = min(ret, max(f(n - i, m), f(i - 1, m - 1)) + 1);
20      return ret;
21  }
22 
23  int g(int n, int m)
24  {
25      for (int i = 1; i <= n; i++)
26          h[i][1] = i;
27      for (int j = 1; j <= m; j++)
28          h[0][j] = 0;
29 
30      for (int i = 1; i <= n; i++) {
31          for (int j = 2; j <= m; j++) {
32              h[i][j] = numeric_limits<int>::max();
33              for (int k = 1; k <= i; k++)
34              h[i][j] = min(
35                  h[i][j],
36                  max(h[i - k][j], h[k - 1][j - 1]) + 1);
37          }
38      }
39 
40      return h[n][m];
41  }
42 
43  int main()
44  {
45      int n, m;
46      cin >> n >> m;
47      cout << f(n, m) << endl << g(n, m) << endl;
48      return 0;
49  }

109.

当输入为 7 3 时,第 1919 行用来取最小值的 min 函数执行了 449449 次。( )

110.

输出的两行整数总是相同的。( )

111.

m11 时,输出的第一行总为 n。( )

112.

算法 g(n,m) 最为准确的时间复杂度分析结果为( )。

113.

当输入为 20 2 时,输出的第一行为( )。

114.

当输入为 100 100 时,输出的第一行为( )。

CSP-J 2022 · 阅读程序 第22-27题 | 知识点 线性DP、递归、二维数组