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天前
leetcode代码记录(打家劫舍 III
leetcode代码记录(打家劫舍 III
10 0
|
2天前
leetcode代码记录(打家劫舍 II
leetcode代码记录(打家劫舍 II
10 3
|
2天前
leetcode代码记录(打家劫舍
leetcode代码记录(打家劫舍
10 1
|
2天前
leetcode代码记录(动态规划基础题(斐波那契数列)
leetcode代码记录(动态规划基础题(斐波那契数列)
9 0
|
2天前
[leetcode~数位动态规划] 2719. 统计整数数目 hard
[leetcode~数位动态规划] 2719. 统计整数数目 hard
|
2天前
|
算法
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
34 1
|
2天前
|
JavaScript
【leetcode】221--最大正方形-动态规划法
【leetcode】221--最大正方形-动态规划法
10 0
|
2天前
|
JavaScript
【leetcode】221. 最大正方形 动态规划法
【leetcode】221. 最大正方形 动态规划法
12 0
|
2天前
|
Go C++
【力扣】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
【2月更文挑战第17天】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
32 8
|
2天前
动态规划之解码方法【LeetCode】
动态规划之解码方法【LeetCode】