零基础Leetcode刷刷刷
大圈儿每日一Leetcode刷题计划,从今日起,安排上了!要坚持啊,冲吖~
好的,废话不多说了,因为是第一遍刷题,所以就只是记录了自己能够消化的思路。
题目描述
题解思路
这是一个动态规划问题,在当前状态采取的行动可根据前面状态采取的行动来决定。在该问题中,小偷不能偷相邻的房子,那么对于第m (m>2) 个房子来说:
- 偷第m个房子,则第(m-1)的房子不能偷,因此,此时偷窃总金额为前(m-2)个房子的最大金额总和加上当前房子里的金额,即:dp_sum[m-2] + dp[m];
- 不偷第m个房子,则偷窃总金额为前(m-1)个房子的最大金额总和。
在1和2选项中,选择金额最大的即为当前状态下的偷窃到的最高金额。
因此,可得到状态转移方程:dp_sum[m] = max(dp_sum[m-2]+nums[m], dp_sum[m-1]);
再考虑边界条件:1)只有1个房子,dp_sum[0] = nums[0];2)只有2个房子,dp_sum[1] = max(nums[0], nums[1]),小偷肯定是要偷钱多的那家啦~
C++代码示例
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if(n == 0){
return 0;
}
if(n == 1){
return nums[0];
}
if(n == 2){
return max(nums[0], nums[1]);
}
vector<int> dp(n);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for(int i=2; i<n; i++){
dp[i] = max(dp[i-1],dp[i-2]+nums[i]);
}
return dp[n-1];
}
};
小小总结
今天这个题目算是初识动态规划问题啦,以后遇到类似的问题可借鉴该思路,而不必把问题想得过于繁琐复杂~