LeetCode动态规划—打家劫舍从平板板到转圈圈(198、213)

简介: LeetCode动态规划—打家劫舍从平板板到转圈圈(198、213)

平板板打家劫舍


转化子问题:

按顺序偷n间房子,就是考虑偷前n-1间房子还是偷前n-2间房子再偷第n间房子。

555291536d444300a0436dc3b0f04f7e.png

列出公式:

res[n] = max{ res[n-1] , 数组中最后一个数据+res[n-2] } (res是前k个房子中偷盗最多的钱的数组)

所以对于第n个数组数据依赖于前n-1和n-2的数据。可以得出dp数组从左到右计算。

同时对于动态规划问题,写dp数组时,要主动的定义好开头。


res[0] = 0

res[1] = nums[0]


同时注意可以增加边界条件,减少花费时间。当只有一家时偷这家结束,或者当只有两家时偷钱最多的一家结束。

class Solution {
public:
    int rob(vector<int>& nums) {
        int length = nums.size();
        if(length == 1)
            return nums[0];
        vector<int> res(length+1,0);
        res[0] = 0;
        res[1] = nums[0];
        for(int i = 2;i <= length;i++)
        {
            res[i] = max(res[i-1],nums[i-1]+res[i-2]);
        }
        return res[length];
    }
};


转圈圈打家劫舍(进阶版)


现在这个小区里面是环形的,就是将首尾变成相邻问题。

那就是偷到最后一家时还要考虑是否前面偷了第一家。但是对于动态规划的dp数组,无法记录是否偷了第一家。

那就考虑将问题分解成两个子问题。

对于第一家和最后一家,将选择一家偷。就分解成偷前n-1家或者第2到第n家的平板板打家劫舍中选最高的结果偷。

列出公式

max{ 忽略第n家,res[n-1] ,忽略第1家,ans从第2家开始偷到第n家}

(res[n-1] = nums[:n-1] ans[n] = nums[1:])

降低空间占用,可以考虑用同一个dp数组,计算完将res[length-1]保存下来,更新res数组。

class Solution {
public:
    int rob(vector<int>& nums) {
        int length = nums.size();
        if(length == 1)
            return nums[0];
        vector<int> res(length+1,0);
        vector<int> ans(length+1,0);
        res[1] = nums[0];
        for(int i = 2;i < length;i++)
        {
            res[i] = max(res[i-1],nums[i-1]+res[i-2]);
            ans[i] = max(ans[i-1],nums[i-1]+ans[i-2]);
        }
        ans[length] = max(ans[length-1],nums[length-1]+ans[length-2]);
        return max(res[length-1],ans[length]);
    }
};
相关文章
|
2月前
|
移动开发 Python
【Leetcode刷题Python】337. 打家劫舍 III
LeetCode 337题 "打家劫舍 III" 的Python解决方案,使用递归和动态规划计算小偷在二叉树结构的房屋中不触发警报的情况下能够盗取的最高金额。
34 1
【Leetcode刷题Python】337. 打家劫舍 III
|
2月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
53 2
|
2月前
|
Python
【Leetcode刷题Python】213. 打家劫舍 II
LeetCode 213题 "打家劫舍 II" 的Python解决方案,通过动态规划处理环形房屋的偷窃问题,计算在不触发警报的情况下能够偷窃到的最高金额。
16 1
|
2月前
|
Python
【Leetcode刷题Python】198. 打家劫舍
LeetCode 198题 "打家劫舍" 的Python解决方案,使用动态规划计算小偷在不触发警报的情况下一夜之内能够偷窃到的最高金额。
34 1
|
4月前
|
缓存
力扣每日一题 6/14 动态规划+数组
力扣每日一题 6/14 动态规划+数组
31 1
|
4月前
|
算法 索引
力扣每日一题 6/28 动态规划/数组
力扣每日一题 6/28 动态规划/数组
42 0
|
4月前
|
存储
力扣每日一题 6/19 排序+动态规划
力扣每日一题 6/19 排序+动态规划
25 0
|
4月前
|
算法
力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学
力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学
32 0
|
4月前
|
机器人
【LeetCode】--- 动态规划 集训(二)
【LeetCode】--- 动态规划 集训(二)
31 0
|
4月前
【LeetCode】--- 动态规划 集训(一)
【LeetCode】--- 动态规划 集训(一)
29 0