leetcode 198.打家劫舍

首先说知识点,就是动态规划问题。

思路:既然是对于最优方案的考虑,我们就需要有一个思想,就是用动态规划的思想进行思考,动态规划解决的便是这种最优化问题,我们首先想一下,既然说是偷盗最多的金额,那么也就是说,从0-n这些范围中,我们需要逐一判断情况。

当没有房子的时候,自然就是0;当只有一个房子的时候,就只有这一个,也就是nums[0];当我们有两个房子的时候,这个时候就是max(nums[0],nums[1])了;当我们的房子数大于2的时候,我们需要思考:怎样才能不在临近的房子里偷取最多的金额呢?暴力首先是不行的,因为我们如果进行暴力的话还需要回溯,这样写起来会非常麻烦;动态规划首先的一个问题就是在分析当前问题的时候能否选这个房子。OK,我们下面做个假设:

如果说我们现在正准备偷第k间房子,这个时候我们有两个选择:第一个是偷,第二个是不偷。当然,这两种可能我们都需要考虑。有人可能会问了,这第k间房子旁边的房子是否已经偷过了呢?还需要考虑吗?答案是不需要。因为我们从0开始一直在做最优解的结构化,也就是说,我们遍历到k的时候其实前面的k-1间我们已经把该考虑的考虑过了,所以我们只需要考虑当前的选择就行了。

于是,我们分析这两个可能性:第一个,如果我们选择偷的话,那么,旁边的房子我们不能偷,也就是说,我们的第k-1个房子是不能偷的,但是我们可以偷第k-2个房子,也就是说在前k-2间房子的偷取金额加上当前的偷取房子,就是这种可能性的金额;第二个,如果我们选择不偷的话,那么,旁边的房子我们就可以考虑了,也就是前k-1个房子偷取的金额数。

这样,我们的转移方程其实就分析出来了:

dp[i]=max(dp[i-2]+nums[i],dp[i-1])

注意,我们需要从i=2开始遍历,因为0,1我们在前面已经考虑过了,所以只需要从第3个开始考虑即可。

上代码:

class Solution {
public:
    int rob(vector<int>& nums) {
        int n=nums.size();
        int sum=0;
        vector<int>dp(n,0);
        if(n==0)
        return 0;
        else if(n==1)
        return nums[0];
        dp[0]=nums[0];
        dp[1]=max(nums[0],nums[1]);
        for(int i=2;i<n;i++){
            dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
        }
        return dp[n-1];
    }
};
相关推荐
manba_5 分钟前
leetcode-560. 和为 K 的子数组
数据结构·算法·leetcode
liuyang-neu5 分钟前
力扣 11.盛最多水的容器
算法·leetcode·职场和发展
忍界英雄14 分钟前
LeetCode:2398. 预算内的最多机器人数目 双指针+单调队列,时间复杂度O(n)
算法·leetcode·机器人
Kenneth風车15 分钟前
【机器学习(五)】分类和回归任务-AdaBoost算法-Sentosa_DSML社区版
人工智能·算法·低代码·机器学习·数据分析
C7211BA33 分钟前
使用knn算法对iris数据集进行分类
算法·分类·数据挖掘
Tisfy35 分钟前
LeetCode 2398.预算内的最多机器人数目:滑动窗口+单调队列——思路清晰的一篇题解
算法·leetcode·机器人·题解·滑动窗口
.普通人37 分钟前
c语言--力扣简单题目(回文链表)讲解
c语言·leetcode·链表
程序猿练习生39 分钟前
C++速通LeetCode简单第18题-杨辉三角(全网唯一递归法)
c++·算法·leetcode
Huazzi.42 分钟前
算法题解:斐波那契数列(C语言)
c语言·开发语言·算法
汉字萌萌哒43 分钟前
【2022 CCF 非专业级别软件能力认证第一轮(CSP-J1)入门级 C++语言试题及解析】
数据结构·c++·算法