首页 > 其他分享 >「动态规划」打家劫舍

「动态规划」打家劫舍

时间:2024-05-27 21:31:50浏览次数:12  
标签:动态 下标 nums int rob 房间 打家劫舍 规划 left

力扣原题链接,点击跳转

有一个小偷,要偷东西。假设有n个房间,每个房间都有现金,下标为i的房间内的现金数是nums[i]。不能同时偷相邻的2个房间,其中第一个房间和最后一个房间是相邻的。那么这个小偷最多能偷到多少现金呢?

由于小偷不能同时偷第一个房间和最后一个房间,可以根据是否偷第一个房间进行分类讨论。

  • 如果偷了下标为0的房间,那么就不能偷下标为1和n-1的房间,下标为2到n-2的房间情况未知。
  • 如果没有偷下标为0的房间,那么下标为1到n-1的房间情况未知。

对于未知情况的房间,可以用动态规划的思路来思考。此时相当于,可以同时偷第一个房间和最后一个房间,其余条件不变。先确定一个状态表示。我们用f[i]表示:偷到下标为i的房间时,且必须偷下标为i的房间,最多能偷到的现金总数。用g[i]表示:偷到下标为i的房间时,不能偷下标为i的房间,最多能偷到的现金总数。此时状态转移方程就呼之欲出了。

  • 如果下标为i的房间必须偷,那么下标为i-1的房间就不能偷,即f[i]=g[i-1]+nums[i]。
  • 如果下标为i的房间不能偷,那么下标为i-1的房间情况未知,即g[i]=max(f[i-1],g[i-1])。

接着解决一些细节问题。根据状态转移方程,f[i]和g[i]都依赖下标为i-1的位置,所以要初始化f[0]=nums[0],g[0]=0,防止越界。填表时应从左往右同时填表,这样能保证填某个位置的值时,前面的值已经准备好了。最后应返回max(f[n-1],g[n-1])。

class Solution
{
public:
    int rob(vector<int>& nums)
    {
        return max(nums[0] + rob(nums, 2, nums.size() - 2), rob(nums, 1, nums.size() - 1));
    }
private:
    int rob(vector<int>& nums, int left, int right)
    {
        if (left > right)
            return 0;
        // 创建dp表
        vector<int> f(nums.size());
        auto g = f;
        // 初始化
        f[left] = nums[left];
        // 填表
        for (int i = left + 1; 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]);
    }
};

标签:动态,下标,nums,int,rob,房间,打家劫舍,规划,left
From: https://blog.csdn.net/xiang_bolin/article/details/139247219

相关文章

  • 「动态规划」删除并获得点数
    力扣原题链接,点击跳转。给你一个整数数组nums。每次操作,可以删除任意一个值n,接着获得点数n,并同时删除所有的n-1和n+1。你最多能获取多少点数?这个问题的解法相当巧妙。我们可以把问题先转化一下。用类似计数排序的思路,定义一个数组arr,用arr[i]表示所有的点数i的和。比如nums数......
  • 算法导论,矩阵链乘法(动态规划)
    直入主题,5.27学的矩阵链相乘(动态规划)题目理解:        1.原题                要求:对A1,A2,A3......An进行矩阵的乘法(线性代数的基础知识),求通过添加括号,以达到的最小乘法次数    2.题目理解        乘法:由于矩阵乘法的结合......
  • vue2+uni-app的实现的动态数据显示
     1:所用技术:Vue2.X,Uview2.0,确保项目上已经安装了Vue2.X 版本和组件Uview(注:其余组件:如ElementUI组件也适用,主要是样式的区别)2:template层<template> <viewclass="NavPage"> <viewclass="LoginCard"> <uni-cardis-shadow:trueclass="CardLogin"......
  • 动态规划--图论中使实用场景概述
    目录一 动态规划概述二 动态规划在图论中应用场景三c实例1.**最短路径问题(Dijkstra算法)**:2.**最小生成树问题(Kruskal算法)**:一 动态规划概述动态规划(DynamicProgramming,简称DP)是一种用于解决具有重叠子问题和最优子结构特性的问题的优化方法。动态规划通过将原......
  • 【二维路径规划】基于快速RRT-star实现二维空间移动机器人运动规划附matlab复现
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 京东云5月产品动态
    1.【智算服务】新品上线智算平台GCS是面向AI创业公司和AI从业者的AI算力生命周期管理和AI应用生命周期管理平台。平台提供高性价比算力资源,以及基于大模型的AI应用生态市场。提供全网低价算力、帮您快速上手AIGC应用。2.【节能宝PUE】新品上线节能宝(PUE优化),是一款京东云面向......
  • 静态库与动态库
    文章目录参考文章一、什么是库1.命名规则2.Linux下生成静态库的步骤3.静态库的使用4.静态库制作举例1.源码2.静态库的制作3.静态库的使用三、动态库1.命名规则2.Linux下生成动态库的步骤3.动态库的使用4.动态库的制作举例1.动态库的制作2.动态库的使用3.解决动态库无法......
  • 《从技术洞察到技术规划赋能》公开课(2024年7月12-13日)
    【课程背景】所谓技术洞察,简称(TI,TechnologyInsight),是根据市场发展趋势和客户需求,以及技术的生命周期,对某项技术发展趋势进行判断和预测,并明确未来3~5年的技术战略和战略控制点、重大的技术投资方向,完成技术战略规划的制订,并最终进行技术战略解码,为公司整体战略创造价值。技术......
  • Tesla技术方案深度剖析:自动标注_感知定位_决策规划_场景重建_场景仿真_数据引擎
    Tesla技术方案深度剖析:自动标注_感知定位_决策规划_场景重建_场景仿真_数据引擎附赠自动驾驶最全的学习资料和量产经验:链接01  感知:构建实时的4D自动驾驶场景1.1 特斯拉摄像头布局特斯拉的摄像头视野可以覆盖车身周围360°,在前向有120°鱼眼、长焦镜头用于加强观测,......
  • Excel工作表单元格单击选中事件,VBA动态数值排序
    Excel工作表单元格单击选中事件,VBA动态数值排序(WX公众号:Excel潘谆白说VBA)文章目录前言一、运行效果二、代码前言面对每月的消费账单,面对月底待还的信用卡或花呗,面对不足三位数的余额,你是否怀疑过账单自己的消费。你是否因此开始记账,每个月记流水,想知道当月......