#G6C09. G6-9 动态规划概念 课后练习
G6-9 动态规划概念 课后练习
- 以下关于动态规划算法特性的描述,正确的是( )。 {{ select(1) }}
- 子问题相互独立,不重叠
- 问题包含重叠子问题和最优子结构
- 只能从底至顶迭代求解
- 必须使用递归实现,不能使用迭代
2、以下关于动态规划的描述,( )是正确的。 {{ select(2) }}
- 动态规划适用于没有重叠子问题的优化问题。
- 动态规划要求问题具有最优子结构和无后效性。
- 动态规划通常通过递归来实现。
- 动态规划与贪心算法不同,贪心算法不适用于有重叠子问题的问题。
- 以下关于动态规划的说法中,错误的是( )。 {{ select(3) }}
- 动态规划方法通常能够列出递推公式
- 动态规划方法的时间复杂度通常为状态的个数
- 动态规划方法有递推和递归两种实现形式
- 对很多问题,递推实现和递归实现动态规划方法的时间复杂度相当
- 青蛙每次能跳1或2步,下面代码计算青蛙跳到第n步台阶有多少种不同跳法。则下列说法,错误的是( )。
int jump_recur(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
return jump_recur(n - 1) + jump_recur(n - 2);
}
int jump_dp(int n) {
vector<int> dp(n + 1); // 创建一个动态规划数组,用于保存已计算的值
// 初始化前两个数
dp[1] = 1;
dp[2] = 2;
// 从第三个数开始计算斐波那契数列
for (int i = 3; i <= n; ++i) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
{{ select(4) }}
- 函数jump_recur()采用递归方式。
- 函数jump_dp()采用动态规划方法。
- 当n较大时,函数jump_recur()存在大量重复计算,执行效率低。
- 函数jump_recur()代码量小,执行效率高。
- 元宵节晚上,小朋友沿着一条发光石板路前进,每次可向前走 1 块或 2 块石板。动态规划定义如下:,下面关于 的含义最合适的是( )。 {{ select(5) }}
- 走到第 i 块石板的不同走法数量
- 走到第 i 块石板时,已经走过的石板总数
- 从第 i 块石板走回起点的最少步数
- 从第 i 块石板走回起点的最大步数
- 能用动态规划解决的问题,一般也可以用贪心法解决,但动态规划的效率更高。 {{ select(6) }}
- 对
- 错
- 动态规划问题通常要求具有最优子结构,并且常常存在重叠子问题。 {{ select(7) }}
- 对
- 错
- 小杨在玩一个闯关游戏,从第 1 关走到第 4 关。每一关的体力消耗如下(下标表示关卡编号):cost = [0, 3, 5, 2, 4],其中 cost[i] 表示到达第 i 关需要消耗的体力,cost[0] = 0 表示在开始状态,体力消耗为 0。小杨每次可以从当前关卡前进 1 步或 2 步。按照上述规则,从第 1 关到第 4 关所需消耗的最小体力为 7。 {{ select(8) }}
- 对
- 错
9、在动态规划问题中,状态空间相同且没有重复计算的情况下,“状态转移方程+递推”与“递归+记忆化搜索”的时间复杂度通常相同。 {{ select(9) }}
- 对
- 错
10、有一排香蕉,每个香蕉有不同的甜度值。小猴子想吃香蕉,但不能吃相邻的香蕉。以下程序能找到小猴子吃到最甜的香蕉组合。 ( )
// bananas:香蕉的甜度
void findSelectedBananas(vector<int>& bananas, vector<int>& dp) {
vector<int> selected;
int i = bananas.size() - 1;
while (i >= 0) {
if (i == 0) {
selected.push_back(0);
break;
}
if (dp[i] == dp[i-1]) {
i--;
} else {
selected.push_back(i);
i -= 2;
}
}
reverse(selected.begin(), selected.end());
cout << "小猴子吃了第: ";
for (int idx : selected) cout << idx+1 << " ";
cout << "个香蕉" << endl;
}
int main() {
vector<int> bananas = {1, 2, 3, 1}; // 每个香蕉的甜
vector<int> dp(bananas.size());
dp[0] = bananas[0];
dp[1] = max(bananas[0], bananas[1]);
for (int i = 2; i < bananas.size(); i++) {
dp[i] = max(bananas[i] + dp[i-2], dp[i-1]);
}
findSelectedBananas(bananas, dp);
return 0;
}
{{ select(10) }}
- 对
- 错