【动态规划】12简单多状态dp问题_打家劫舍II_C++ (medium)

这篇具有很好参考价值的文章主要介绍了【动态规划】12简单多状态dp问题_打家劫舍II_C++ (medium)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目链接:leetcode打家劫舍II


目录

题目解析:

算法原理

1.状态表示

2.状态转移方程

3.初始化

4.填表顺序

5.返回值

编写代码


题目解析:

【动态规划】12简单多状态dp问题_打家劫舍II_C++ (medium),动态规划,算法,动态规划,c++,leetcode,开发语言

题目让我们求在不触动警报装置的情况下 ,能够偷窃到的最高金额。

由题可得:

第一个房屋和最后一个房屋是紧挨着的

如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 (所以不能偷相邻的位置)

我们用示例二分析:

因为第一个房屋和最后一个房屋是紧挨着

所以如果我们在这里选了第一个,那么第二个和最后一个就不能选。

【动态规划】12简单多状态dp问题_打家劫舍II_C++ (medium),动态规划,算法,动态规划,c++,leetcode,开发语言

此时我们就只能在第三个和n-1个中选择;

如果我们在这里不选第一个,那么最后一个就能选。

【动态规划】12简单多状态dp问题_打家劫舍II_C++ (medium),动态规划,算法,动态规划,c++,leetcode,开发语言

此时我们就只能在第二个和n个中选择;


算法原理:

1.状态表示

先创建一个dp表

【动态规划】12简单多状态dp问题_打家劫舍II_C++ (medium),动态规划,算法,动态规划,c++,leetcode,开发语言

首先先思考dp表里面的值所表示的含义(是什么?)

因为我们这里的每个位置可以选或者不选

所以这里我们一个位置就有两种状态

这里就要创建两个dp表来表示这两种状态:

f[i]表示到i位置,此时到i位置能够偷窃到的最高金额;

g[i]表示到i位置不选,此时到i位置能够偷窃到的最高金额;

这种状态表示怎么来的?

1.经验+题目要求

用之前或者之后的状态,推导出dp[i][j]的值;

根据最近的最近的一步,来划分问题

经验:以i位置为结尾;

题目让我们求能够偷窃到的最高金额,且该位置可选可不选

这里我们需要用两个表来同时表示这种状态;

2.状态转移方程

dp[i]等于什么?

 因为i位置可选可不选,所有两种情况:

第一种情况:(i位置选)

【动态规划】12简单多状态dp问题_打家劫舍II_C++ (medium),动态规划,算法,动态规划,c++,leetcode,开发语言

那么i-1位置必然不选:

此时我们只要知道在i-1之前所能够偷窃到的最高金额(g[i-1])+i位置的金额(nums[i])

所以这种情况下的状态转移方程为:

dp[i]=f[i-1]+nums[i];

第二种情况:(i位置不选)

【动态规划】12简单多状态dp问题_打家劫舍II_C++ (medium),动态规划,算法,动态规划,c++,leetcode,开发语言

那么i-1位置可以选也可以不选

这里会分两种情况:

情况a:(i-1

此时我们只要知道在i-1之前所能够偷窃到的最高金额(f[i-1])

所以这种情况下的状态转移方程为:

dp[i]=f[i-1];

情况b:(i-1不选

此时我们只要知道在i-1之前所能够偷窃到的最高金额(g[i-1])

所以这种情况下的状态转移方程为:

dp[i]=g[i-1];

最后取a,b情况的最大值:max(f[i-1],g[i-1])

综上:

【动态规划】12简单多状态dp问题_打家劫舍II_C++ (medium),动态规划,算法,动态规划,c++,leetcode,开发语言

3.初始化

(保证填表的时候不越界)

由状态转移方程得:

我们在f[0]g[0]会越界,所以需要把这两个位置初始化;

当第一个位置选,那么它能够偷窃到的最高金额f[0]为该位置的时长(f[0]=nums[0]);

当第一个位置不选,那么它能够偷窃到的最高金额g[0]为0(g[0]=0);

4.填表顺序

(为了填写当前状态的时候,所需要的状态已经计算过了)

这里所需要的状态是:

这里所需要的状态是:i-1

所以填表顺序:从左到右

5.返回值

(根据题目要求和状态表示)

综上分析:

最后一个位置可选可不选,所以返回这两个状态的最小值

返回值为:max(f[n-1],g[n-1]);


编写代码:

【动态规划】12简单多状态dp问题_打家劫舍II_C++ (medium),动态规划,算法,动态规划,c++,leetcode,开发语言文章来源地址https://www.toymoban.com/news/detail-783777.html

class Solution {
public:
    int rob(vector<int>& nums) {
        //1.创建dp表
        //2.初始化
        //3.填表
        //4.返回结果

        int n=nums.size();
        return max(rod1(nums,2,n-2)+nums[0],rod1(nums,1,n-1));
    }
        int rod1(vector<int>& nums,int left,int right)
        {
            //处理边界问题 
            if(left>right)
                return 0;          
            int n=nums.size();
            vector<int> f(n);
            auto g=f;

            f[left]=nums[left];


            for(int i=left;i<=right;i++)
            {
                f[i]=g[i-1]+nums[i];
                g[i]=max(f[i-1],g[i-1]);
            }
            return max(f[right],g[right]);

        }


};

到了这里,关于【动态规划】12简单多状态dp问题_打家劫舍II_C++ (medium)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode动态规划#11】打家劫舍系列题(涉及环结构和树形DP的讨论)

    力扣题目链接(opens new window) 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非

    2023年04月21日
    浏览(37)
  • 力扣爆刷第77天--动态规划一网打尽打家劫舍问题

    力扣爆刷第77天–动态规划一网打尽打家劫舍问题 一、198.打家劫舍 题目链接:https://leetcode.cn/problems/house-robber/ 思路:小偷不能连续两家偷,由此可以定义dp[i]表示,小偷经过[0,i]所能获取到的最大金额,那么我们可以得到递推公式: dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i]); 即如果偷

    2024年02月22日
    浏览(48)
  • 打家劫舍 II问题的动态规划解决方案及C++代码实现

    解决打家劫舍 II问题涉及动态规划,将环形问题转化为两个单排问题。通过状态转移方程和初始化,计算可以偷窃到的最高金额。C++代码实现包括状态显示、状态转移方程、初始化、填表顺序和返回值。

    2024年01月21日
    浏览(50)
  • 「动态规划」简单多状态dp问题

    以经典问题“打家劫舍”来解释简单多状态dp问题和解决方法 题目链接:打家劫舍I 这种问题就是在某一个位置有多个状态可以选择,选择 不同的状态 会影响 最终结果 在这道题中就是小偷在每一个房屋,可以选择偷或不偷,每一次选择都会影响最终偷窃金额 状态表示 因为

    2024年03月15日
    浏览(56)
  • 【动态规划】简单多状态dp问题(2)买卖股票问题

    买卖股票问题 传送门:力扣309. 最佳买卖股票时机含冷冻期 题目: 1.1 题目解析 越难的dp问题,看示例只能起到了解题目的效果,一般推不出啥普遍的规律,所以接下来就是我们的算法原理,通过动归的思想去理解,才会豁然开朗! 1.2 算法原理 1.2.1 状态表示 我们需要通过经

    2024年02月12日
    浏览(56)
  • 算法沉淀 —— 动态规划篇(简单多状态dp问题下)

    几乎所有的动态规划问题大致可分为以下5个步骤,后续所有问题分析都将基于此 1.、状态表示:通常状态表示分为基本分为以下两种,其中更是以第一种为甚。 以i为结尾 ,dp[i] 表示什么,通常为代求问题(具体依题目而定) 以i为开始 ,dp[i]表示什么,通常为代求问题(具

    2024年04月16日
    浏览(46)
  • 【算法优选】 动态规划之简单多状态dp问题——贰

    动态规划相关题目都可以参考以下五个步骤进行解答: 状态表示 状态转移⽅程 初始化 填表顺序 返回值 后面题的解答思路也将按照这五个步骤进行讲解。 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 设计一个算法计算出最大利润。在满足以下约束条件下,

    2024年04月12日
    浏览(35)
  • 算法沉淀 —— 动态规划篇(简单多状态dp问题上)

    几乎所有的动态规划问题大致可分为以下5个步骤,后续所有问题分析都将基于此 1.、状态表示:通常状态表示分为以下两种,其中更是第一种为主。 以i为结尾 ,dp[i] 表示什么,通常为代求问题(具体依题目而定) 以i为开始 ,dp[i]表示什么,通常为代求问题(具体依题目而

    2024年04月11日
    浏览(44)
  • 动态规划_打家劫舍(Ⅰ~Ⅲ)

    打家劫舍系列 返回最大金额 不能同时取相邻两个数 数组数据全部非负 ①dp数组含义 dp[i]表示前i个数中按规则取出的最大总和 ②递推公式 dp[i]=max(dp[i-1],dp[i-2]+nums[i]) 当前最优可以从两个状态推出(前提是前面已经为最优解): 1° 前一个数未取:则当前数取了,则总和最大

    2024年02月03日
    浏览(40)
  • 力扣198. 打家劫舍(java 动态规划)

    Problem: 198. 打家劫舍 1.构建多阶段决策模型:n个房屋对应n个阶段,每一个阶段决定一个房间是偷还是不偷,两种决策:偷、不偷 2.定义状态:不能记录每个阶段决策完之后,小偷可偷的最大金额,需要记录不同决策对应的最大金额,也就是:这个房屋偷-对应的最大金额;这

    2024年01月21日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包