【发布时间】:2017-11-03 19:45:34
【问题描述】:
我正在尝试解决以下 DP 问题:
给定一个代表每所房子金额的非负整数列表,确定今晚你可以在不报警的情况下抢劫的最大金额。您不能抢劫相邻的房屋,因为这样做会引起警察的注意。
给出的解决方案之一是:
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.empty())
return 0;
if(nums.size()==1)
return nums[0];
vector<int> dp(nums.size());
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for(int i=2; i<(int)nums.size(); i++) {
dp[i] = max(dp[i-2]+nums[i], dp[i-1]);
}
return dp[nums.size()-1];
}
};
有人可以指出dp[1]初始化背后的直觉:
dp[1] = max(nums[0], nums[1]);
我将它初始化为dp[1] = nums[1]。但是,它会在 [3,1,4,10] 之类的测试用例上中断。当我们将其初始化为max(nums[0], nums[1]); 时,我们不是有点 将输入数组更改为[3,3,4,10] 吗?它如何帮助我们找到最终(正确)的解决方案?
注意:问题来自here。
编辑:指南是否建议在对此类问题的基本案例进行硬编码时考虑我们的主要 DP 公式?
【问题讨论】: