LeetCode 198.打家劫舍
程序员文章站
2022-03-07 19:44:37
...
一,问题描述
二,问题分析
每一间房屋你都有偷或者不偷两种选择,且不可偷相邻的房屋,从最后一项开始分析,到最后一间房子n能够的最大金额有两个来源,一是不偷最后一间房屋,得到前n-1项房屋的最大值,二是偷最后一间房屋那么就不偷第n-1的房屋,那么最大金额就是前 n-2间房屋的最大值加上偷最后一间房屋的金额。两种情况取最大值即可,很明显满足最优子结构。
1.定义状态 dp[i] :表示0-i所房屋能够偷取的最大值
2.初始状态:dp[0] = nums[0];
dp[1] = max(nums[0],nums[1]);
2.状态转移:dp[i] = max(dp[i-1],dp[i-2]+nums[i]);
三,问题解答
class Solution {
public:
int rob(vector<int>& nums) {
//dp[i] : 表示前 i 个房屋能够获得的最大值
int len = nums.size();
if(len == 0){ //输入情况是空即 nums = [];
return 0;
}
if(len == 1){ //输入情况只有一个房屋即 nums = [ i ];
return nums[0];
}
vector<int> dp(len);
dp[0] = nums[0]; //初始状态
dp[1] = max(nums[0],nums[1]);
for(int i=2;i<len;i++){ //状态转移
dp[i] = max(dp[i-1],dp[i-2]+nums[i]);
}
return dp[len-1]; //返回最大值
}
};