题目大意:
你是一名专业强盗,计划沿着一条街打家劫舍。每间房屋都储存有一定数量的金钱,唯一能阻止你打劫的约束条件就是:由于房屋之间有安全系统相连,如果同一个晚上有两间相邻的房屋被闯入,它们就会自动联络警察,因此不可以打劫相邻的房屋。
给定一列非负整数,代表每间房屋的金钱数,计算出在不惊动警察的前提下一晚上最多可以打劫到的金钱数。
解题思路:
动态规划(Dynamic Programming)
状态转移方程:
dp[i] = max(dp[i - 1], dp[i - 2] + num[i - 1])
其中,dp[i]表示打劫到第i间房屋时累计取得的金钱最大值。
其中dp[0]即为num[0],dp[1]此时应该为max(num[0], num[1]),代码如下:
你是一名专业强盗,计划沿着一条街打家劫舍。每间房屋都储存有一定数量的金钱,唯一能阻止你打劫的约束条件就是:由于房屋之间有安全系统相连,如果同一个晚上有两间相邻的房屋被闯入,它们就会自动联络警察,因此不可以打劫相邻的房屋。
给定一列非负整数,代表每间房屋的金钱数,计算出在不惊动警察的前提下一晚上最多可以打劫到的金钱数。
解题思路:
动态规划(Dynamic Programming)
状态转移方程:
dp[i] = max(dp[i - 1], dp[i - 2] + num[i - 1])
其中,dp[i]表示打劫到第i间房屋时累计取得的金钱最大值。
其中dp[0]即为num[0],dp[1]此时应该为max(num[0], num[1]),代码如下:
时间复杂度O(n),空间复杂度O(n)
<span style="font-family:Microsoft YaHei;font-size:14px;">class Solution {
public:
int rob(vector<int> &num) {
if(num.size() <=1 ) return num.size()==0 ? 0 : num[0];
vector<int> dp = {num[0],max(num[0],num[1])};
for(int i=2; i < num.size(); i++){
dp.push_back(max(dp[i-2]+num[i],dp[i-1]));
}
return dp.back();
}
};</span>
也可以简化,不使用vector<int>来保存结果
class Solution {
public:
int rob(vector<int> &num) {
int len = num.size();
if(len == 0) return 0;
if(len == 1) return num[0];
int res = 0,prev = 0;
for(int i = 0; i < len; i++){
int tmp = prev;
prev = res;
res = max(tmp+num[i],prev);
}
return res;
}
};
转自:http://bookshadow.com/weblog/2015/04/01/leetcode-house-robber/
bookshadow上有很多leetcode的解题思路,讲的很正确,可以参考