【每日一Leetcode】

零基础Leetcode刷刷刷

大圈儿每日一Leetcode刷题计划,从今日起,安排上了!要坚持啊,冲吖~
好的,废话不多说了,因为是第一遍刷题,所以就只是记录了自己能够消化的思路。

题目描述

题解思路

这是一个动态规划问题,在当前状态采取的行动可根据前面状态采取的行动来决定。在该问题中,小偷不能偷相邻的房子,那么对于第m (m>2) 个房子来说:

  1. 偷第m个房子,则第(m-1)的房子不能偷,因此,此时偷窃总金额为前(m-2)个房子的最大金额总和加上当前房子里的金额,即:dp_sum[m-2] + dp[m];
  2. 不偷第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];
    }
};

小小总结

今天这个题目算是初识动态规划问题啦,以后遇到类似的问题可借鉴该思路,而不必把问题想得过于繁琐复杂~

猜你喜欢

转载自www.cnblogs.com/renny-zhao/p/12989223.html