Question 23

是否总输出最小元素

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

判断题阅读程序2难度 基础

正确答案

×

一句话考点

程序输出的是“走到楼顶的最小总代价”,不是数组中的最小单个元素。

动态规划函数含义

Shared Context

阅读程序(2)最小花费爬楼梯

这一组程序本质上是 `min cost climbing stairs` 的动态规划模型。

状态定义

`dp[i]` 不是数组前 i 项的最小值,而是“到达第 i 阶”的最小代价。

边界条件

`dp[0] = 0`、`dp[1] = cost[0]` 这两个初始化决定了后面的转移是否正确。

常考变化

改错题通常围绕下标偏移、取 min 的位置和返回值三处展开。

cpp

共享程序片段
#include <iostream>
#include <vector>
using namespace std;

int compute(vector<int>& cost) {
  int n = cost.size();
  vector<int> dp(n + 1, 0);
  dp[1] = cost[0];
  for (int i = 2; i <= n; i++) {
    dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i - 1];
  }
  return min(dp[n], dp[n - 1]);
}

int main() {
  int n;
  cin >> n;
  vector<int> cost(n);
  for (int i = 0; i < n; i++) {
    cin >> cost[i];
  }
  cout << compute(cost) << endl;
  return 0;
}

题组阅读提醒

数组 `dp[i]` 表示到达第 i 级台阶时的最小花费,状态转移来自前一阶和前两阶的较小值。

返回 `min(dp[n], dp[n - 1])` 代表最后可以从倒数第一阶或倒数第二阶跨到楼顶,因此不必一定踩在最后一级。

本题属于第 阅读程序 分区,题组覆盖题号: 21、22、23、24、25、26

Prompt

题目与选项

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

判断题没有选项,直接根据程序逻辑判断题干陈述是否成立。

Quick Check

做题抓手

先判断题型

先确认陈述是在描述函数职责、输出值还是程序修改后的影响。

再核对边界

第一轮很爱在闭区间、下标偏移、递归终止条件和布尔返回值上设陷阱。

最后看输出层次

尤其是阅读程序题,要分清函数返回值、变量值和最终打印值是不是同一件事。

Explanation

详细讲解

  1. Step 1

    动态规划求的是一条路径的总代价最小,而不是在数组里挑一个最小数。

  2. Step 2

    例如 `{10, 15, 20}` 的最小元素是 10,但程序输出是 15,这已经足以说明题干结论不成立。

  3. Step 3

    因此该判断错误,应填 `×`。

Pitfalls

易错点

  • 看到 `min(...)` 就误以为程序只是在找数组最小值。
  • 没有结合完整状态转移理解 `dp` 的实际含义。

Extend

拓展补充

  • 读程序时,遇到 `min`、`max` 等函数名,要先问“它比较的是什么状态”,而不是只看字面意思。

返回总览

回到整套试卷

返回题目总览页,继续从目录、知识图谱或其他分区进入。

所属分区

返回 阅读程序

回到首页对应分区,继续顺序刷题或查看同类知识点。

上一题

第 22 题

dp[i-3] 是否会编译错误

下一题

第 24 题

经典楼梯样例输出