力扣198.打家劫舍
题目连接:力扣198.打家劫舍
题目详情:
毫无疑问,看到这道题就应该想到是动态规划啦!
我的思路是这样子:
使用二维dp来维护,分别表示:dp[0][1],dp[1][1]分别表示第一家在不被打劫时所可以偷的钱,第一家在被打劫之后可以偷的钱。
算法过程是这样:在这一家,如果想要偷钱,就必须保证前面一家不被打劫,也就是可以取前面的前面那一家在被打劫和不被打劫的最大值,然后加上这一家的钱。如果不打算偷这一家,那么取前面一家在被打劫和不被打劫的最大值即可,初始化时,可以首先知道第一家打劫和不被打劫的情况,同时考虑算法会越到前面的两位,所以dp[0][0]需要初始化为0,防止数组越界,我们直接看下算法:
class Solution {
public:
int rob(vector<int>& nums) {
int ans = 0;
int dp[2][105];
dp[0][0] = 0;
dp[1][0] = 0;
dp[0][1] = 0;
dp[1][1] = nums[0];
ans = dp[1][1];
for(int i = 1; i < nums.size(); i++){
dp[0][i+1] = max(dp[0][i], dp[1][i]);
dp[1][i+1] = max(dp[0][i-1], dp[1][i-1]) + nums[i];
ans = max(ans, max(dp[0][i+1], dp[1][i+1]));
}
return ans;
}
};
结果: