LeetCode198. 打家劫舍
用dp[i]表示打劫到第i个房子(i从0开始)时能获取到的最高金额,显然对于第i个房子,我们有打劫和不打劫两种方案。
如果不打劫第i个房子,那么到第i个房子能获取的最高金额和到第i - 1个房子能获取到的最高金额是一样的(因为到了第i个房子这里没有收入嘛)。因此我们有dp[i] = dp[i - 1];
如果打劫第i个房子,那么到第i个房子能获取到的最高金额就是到第i - 2个房子能获取到的最高金额加上打劫第i个房子获得的收入(因为不能连着打劫,所以是第i - 2个房子)。因此我们有dp[i] = dp[i - 2] + nums[i];
但是对于一个房子,我们不知道最佳方案里是否要打劫这个房子,所以对于两种方案取最大值,就是当前的最高金额了。
最后的返回值就是打劫到最后一个房子能获取到的最高金额。
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size() == 0) {
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 < nums.size(); ++i) {
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[nums.size() - 1];
}
};