阅读程序第二题解析
#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;
}
题目解析
判断题
- 当输入的 cost 数组为 {10, 15, 20} 时,程序的输出为 15。(正确)
解析:模拟一遍过程:
步骤 | dp值计算过程 | dp值 | 当前最小成本 |
---|
0 | - | dp[0] = 0 | - |
1 | dp[1] = cost[0] | dp[1] = 10 | - |
2 | min(dp[0], dp[1]) + 15 = 0 + 15 | dp[2] = 15 | - |
3 | min(dp[1], dp[2]) + 20 = 10 + 20 | dp[3] = 30 | min(15, 30) = 15 |
- 如果将 dp[i-1] 改为 dp[i-3],程序可能会产生编译错误。(错误)
解析:这样改语法仍然合法,不会产生编译错误,但可能会因为数组越界而导致运行时错误。 - 程序总是输出 cost 数组中最小的元素。(错误)
解析:很显然,输出不是输出最小的元素。
单选题
- 当输入的 cost 数组为 {1,100,1,1,1,100,1,1,100,1} 时,程序的输出为(A)。
A. 6
B. 7
C. 8
D. 9
解析:模拟一遍过程:
步骤 | dp值计算过程 | dp值 | 当前最小成本 |
---|
0 | - | dp[0] = 0 | - |
1 | dp[1] = cost[0] | dp[1] = 1 | - |
2 | min(dp[0], dp[1]) + 100 = 0 + 100 | dp[2] = 100 | - |
3 | min(dp[1], dp[2]) + 1 = 1 + 1 | dp[3] = 2 | - |
4 | min(dp[2], dp[3]) + 1 = 2 + 1 | dp[4] = 3 | - |
5 | min(dp[3], dp[4]) + 1 = 2 + 1 | dp[5] = 3 | - |
6 | min(dp[4], dp[5]) + 100 = 3 + 100 | dp[6] = 103 | - |
7 | min(dp[5], dp[6]) + 1 = 3 + 1 | dp[7] = 4 | - |
8 | min(dp[6], dp[7]) + 1 = 4 + 1 | dp[8] = 5 | - |
9 | min(dp[7], dp[8]) + 100 = 4 + 100 | dp[9] = 104 | - |
10 | min(dp[8], dp[9]) + 1 = 5 + 1 | dp[10] = 6 | min(104, 6) = 6 |
- 如果输入的 cost 数组为 {10,15,30,5,5,10,20},程序的输出为(B)。
A. 25
B. 30
C. 35
D. 40
解析:模拟一遍过程:
步骤 | dp值计算过程 | dp值 | 当前最小成本 |
---|
0 | - | dp[0] = 0 | - |
1 | dp[1] = cost[0] | 10 | - |
2 | min(0, 10) + 15 | 15 | - |
3 | min(10, 15) + 30 | 40 | - |
4 | min(15, 40) + 5 | 20 | - |
5 | min(40, 20) + 5 | 25 | - |
6 | min(20, 25) + 10 | 30 | - |
7 | min(25, 30) + 20 | 45 | min(30, 45) = 30 |
- 若将代码中的 min(dp[i - 1], dp[i - 2]) + cost[ i - 1] 修改为 dp[i - 1] + cost[i - 2],输入 cost 数组为 {5,10,15} 时,程序的输出为(A)。
A. 10
B. 15
C. 20
D. 25
解析:
步骤 | dp值计算过程 | dp值 | 当前最小成本 |
---|
0 | - | dp[0] = 0 | - |
1 | dp[1] = cost[0] | dp[1] = 5 | - |
2 | dp[1] + cost[0] = 5 + 5 | dp[2] = 10 | - |
3 | dp[2] + cost[1] = 10 + 10 | dp[3] = 20 | min(20, 10) = 10 |