代码编织梦想

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

示例 1:

输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

相当于跑两次dp,一次偷第一家,一次不偷,取最大值

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

 注意起始点与结束点。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43791787/article/details/125565869

leetcode 700题 题解答案集合 python-爱代码爱编程

2019.5.12更新至题号796,目前共有265题。 2019.5.26更新至题号72, 目前共有347题。 2019.6.16更新至题号70,目前共有382题。 2019.7.7更新至题号5120,目前共有442题。 2019.8.5更新至题号1147,目前共有502题。 2019.9.6更新至题号288, 目前共有551题。 2019.1

[算法]LeetCode每日一题--198 打家劫舍-爱代码爱编程

DailyChallenge 198 打家劫舍 Easy20200529 Description 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装

leetcode5-29每日一题:打家劫舍-爱代码爱编程

这个名字就有点怪怪的…… 题目如下所示: 这是一个很典型的动态规划问题,思路也比较简单。思路如下所示: 对于第二间房子之后的某一间房子(假设是第i间)来说,到了这间房子时的累计“偷窃”到的金额数可以这样表示:到第i间房子的累计量 = max(到第i-1间房子的累计量, 第i-2间房子的累计量+第i间房子的金额)。 max函数里面的两种情况分别对应从

每日一题 -- LeetCode (二十五)-爱代码爱编程

JavaScript / TypeScript for LeetCode 当前进程: 开始时间:2020.6.27结束时间:undefinedGitHub仓库:https://github.com/Cundefined/JavaScript-or-TypeScript-for-LeetCode 参考视频:https://www.bilibili.co

Leetcode刷题之旅(每日一题)--337. 打家劫舍 III-爱代码爱编程

题目描述: 思路:跟原来一样还是动态规划的思想,但是由于是二叉树并不适合用数组那该怎么办?一开始没想出来,用的递归的思路做的。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; *

Leetcode---337. 打家劫舍 III---每日一题---树型DP(记忆化DFS)-爱代码爱编程

打家劫舍 III 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚

Leetcode每日一题:198.house-robber(打家劫舍)-爱代码爱编程

思路:明显的动态规划,用money[i]存放打劫至第i家时得到的最多的金额,那么money[i]=max(money[i-2]+nums[i] ,money[i-1]) 因为不能打劫邻居 或者说money[i]代表打劫至第i家时的最佳方案(即最高金额); class Solution { public: int rob(vector<int&g

【每日一题】LeetCode - 动态规划题目(2)-爱代码爱编程

文章目录 1. 70. 爬楼梯 (https://leetcode-cn.com/problems/climbing-stairs/)2. 198. 打家劫舍 (https://leetcode-cn.com/problems/house-robber/)3. 413. 等差数列划分 (https://leetcode-cn.com/problem

Leetcode----213打家劫舍||+198打家劫舍|-爱代码爱编程

今天的每日一题是《打家劫舍||》,先找到《打家劫舍|》做一下,熟悉一下题目。 打家劫舍| 解题思路 简单的动态规划问题,找到规律就非常简单,但是题目的范围给挖了一个坑,需要注意规避(数组的长度是从0开始的,所以要对数组长度为0的情况进行处理,虽然我没尝试不处理会怎么样,但是也应该注意到这个问题)。 因为不能偷连续的两个房子的财物,所以对于数

【每日一题】LeetCode 213.打家劫舍II - 线性DP-爱代码爱编程

LeetCode 213.打家劫舍II 思路 这道题有一道前置题目,即LeetCode 198.打家劫舍,这道前置题目没有环形,是一道常规的线性DP,在每一步都分别判定选和不选的状态即可,而到了本题内,因为是环形的,那么在起始点(终点)的地方就要注意一下,这里起点终点相互影响,所以我们要用分支结构控制一下每个分支的计算的房子,防止少判断 C++代码

LeetCode每日一题-打家劫舍II-爱代码爱编程

题目 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金

学习贪心算法_allenc6的博客-爱代码爱编程

一、贪心算法思想 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 二、什么时候采用贪心算法 1.最优子结构性质 当一个问题的最优解一定包含其子问题的最优解时,称此问题具有最优子结构性质。如何理解?换句话说:最优解一定是子问题的最优解组合而成的。没

每日一题leetcode--删除并获得点数(dp)_电击公主就是我的lp的博客-爱代码爱编程

给你一个整数数组 nums ,你可以对它进行一些操作。 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。 开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。 示例 1: 输入:nums = [3,4,2] 输出: