当前位置: 首页 > news >正文

【动态规划】简单多状态

文章目录

  • 动态规划(简单多状态)
    • 1. 按摩师
    • 2. 打家劫舍 ||
    • 3. 删除并获得点数
    • 4. 粉刷房子
    • 5. 最佳买卖股票时机含冷冻期
    • 6. 买卖股票的最佳时机含手续费
    • 7. 买卖股票的最佳时机 |||
    • 8. 买卖股票的最佳时机 IV

动态规划(简单多状态)

1. 按摩师

题目链接

  1. 状态表示

    dp[i]表示到i位置的时候预约的最大时长。但是这个题目我们可以选择接或不接。因此可以继续划分为两个子状态:

    • f[i]表示:到i位置时接受的最大时长
    • g[i]表示:到i位置时不接受的最大时长
  2. 状态转移方程

    2vu4cjw7da-1690362953455.png

  3. 初始化

    因为这个题目比较简单,所以不需要使用虚拟节点的方法,初始化是为了后面填表的时候不越界

    f[0] = nums[0], g[0] = 0

  4. 填表

    从左到右

  5. 返回值

    接受最后一个或者不接受的最大值

AC代码:

class Solution 
{
public:int massage(vector<int>& nums) {int n = nums.size();if (n == 0) return 0;vector<int> f(n);auto g = f;f[0] = nums[0], g[0] = 0;for (int i = 1; i < n; i++){f[i] = g[i - 1] + nums[i];g[i] = max(f[i - 1], g[i - 1]);}return max(f[n - 1], g[n - 1]);}
};

2. 打家劫舍 ||

题目链接

分析:

由于房间是连续的,也就是一个环,因此可以分类讨论:

  • 偷第一个时,第二个和最后一个不能偷
  • 不偷第一个,可以偷第二个和最后一个

因此只需要两种情况的最大值就可以

  1. 状态表示

    dp[i]表示偷到i时的最大金额,但是依然可以划分为两种情况偷或不偷

    f[i]表示偷i时的最大金额

    g[i]表示不偷i时的最大金额

  2. 状态转移方程

    qx81yjpg3g-1690364303443.png

  3. 初始化

    保证后续的填表不越界

  4. 填表

    从左到右,两个一起填

  5. 返回值

    最大值

AC代码:

class Solution 
{
public:int rob(vector<int>& nums) {int x = 0, y = 0;int n = nums.size();x += nums[0];x += recursion(2, n - 2, nums);y += recursion(1, n - 1, nums);return max(x, y);}int recursion(int left, int right, vector<int> &v){if (left > right) return 0;int n = v.size();vector<int> f(n);auto g = f;f[left] = v[left]; // 初始化for (int i = left + 1; i <= right; i++){f[i] = g[i - 1] + v[i];g[i] = max(g[i - 1], f[i - 1]);}return max(f[right], g[right]);}
};

3. 删除并获得点数

题目链接

分析:我们把所有数字的点数之和,放到一个数组当中,在进行一次打家劫舍就可以了

把原数组转换成一个新数组,新数组的下标i所对应的值为原数组的元素i在原数组中数字的总和,比如原数组[2, 2, 3, 3, 3, 4],转换为新数组就是[0, 0, 4, 9, 4]。在新数组中,下标0和1表示在原数组中没有0和1这两个数,新数组下标2的值是4,表示在原数组中,所有2的总和是4。转换的目的就是可以从新数组中得到删除nums[i]而得到的点数,也就是可以打劫的金额。因为删除nums[i]后,还要删除nums[i] + 1nums[i] - 1,在新数组中就意味着不能取相邻的元素,不能取相邻的元素和打家劫舍也是一样的。接下来就可以使用打家劫舍的方式解答了

AC代码:

class Solution 
{
public:const int N = 10001;int deleteAndEarn(vector<int>& nums) {vector<int> arr(N);for (auto e : nums) arr[e] += e;vector<int> g(N);auto f = g;for (int i = 1; i < N; i++){f[i] = g[i - 1] + arr[i];g[i] = max(g[i - 1], f[i - 1]);}return max(g[N - 1], f[N - 1]);}
};

4. 粉刷房子

题目链接

  1. 状态表示

    dp[i]表示到i时,所需的最少费用。但是到i的时候可以有三种情况我们需要分三个子状态

    dp[i][0], dp[i][1], dp[i][2]

  2. 状态转移方程

    wrmwgl7sbc-1690365960472.png

  3. 初始化

    采用虚拟节点的方式

  4. 填表

  5. 返回值

    返回三个表中的最小值

AC代码:

class Solution 
{
public:int minCost(vector<vector<int>>& costs) {// 0: 红色 1:蓝色 2:绿色int n = costs.size();vector<vector<int>> dp(n + 1, vector<int>(3));for (int i = 1; i <= n; i++){dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + costs[i - 1][0];dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + costs[i - 1][1];dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + costs[i - 1][2];}int ret = INT_MAX;for (int i = 0; i < 3; i++){ret = min(ret, dp[n][i]);}return ret;}
};

5. 最佳买卖股票时机含冷冻期

题目链接

  1. 状态表示

    dp[i]表示到i位置时的最大利润,但是到达i位置的时候仍然有3种子状态

    • dp[i][0],表示i过后处于买入状态
    • dp[i][1], 表示i过后处于可交易状态
    • dp[i][2],表示i过后处于冷冻期状态
  2. 状态转移方程

    像这种状态之间可以相互转换的,我们可以采用如下方法分析:

    bh40p1zbcb-1690367957450.png

  3. 初始化

    dp[0][0] = -prices[0], dp[0][1] = 0, dp[0][2] = 0

  4. 填表

    三张表同时填

  5. 返回值

    返回三中状态最后的最大值

AC代码:

class Solution 
{
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(n, vector<int>(3));dp[0][0] = -prices[0];for (int i = 1; i < n; i++){dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);dp[i][1] = max(dp[i - 1][1], dp[i - 1][2]);dp[i][2] = dp[i - 1][0] + prices[i];}return max(max(dp[n - 1][0], dp[n - 1][1]), dp[n - 1][2]);}
};

6. 买卖股票的最佳时机含手续费

题目链接

  1. 状态表示

    dp[i]表示到i位置的时候,最大的利润但是到i位置的时候是有两种状态的

    dp[i][0]:表示是买入状态

    dp[i][1]表示卖出状态

  2. 状态转移方程

    ogyovzrz17-1690372796443.png

  3. 初始化

    刚开始如果是买入状态dp[0][0] = -prices[0]

  4. 填表

  5. 返回值

AC代码:

class Solution 
{
public:int maxProfit(vector<int>& prices, int fee) {int n = prices.size();vector<vector<int>> dp(n, vector<int>(2));dp[0][0] = -prices[0];for (int i = 1; i < n; i++){dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);}return max(dp[n - 1][0], dp[n - 1][1]);}
};

7. 买卖股票的最佳时机 |||

题目链接

  1. 状态表示

    dp[i]表示到i位置的最大利润,但是还分为几个状态

    f[i][j]表示到i是第j次买入的最大利润

    g[i][j]表示到i是第j次买入的最大利润

  2. 状态转移方程

    zrwwmb104n-1690374918443.png

  3. 初始化

    f[0][0] = -prices[0], g[0][0] = 0

  4. 填表

    从上往下,每一行从左到右

  5. 返回值

    卖出状态最后的几个中的最大值

AC代码:

class Solution 
{
public:const int N = 0x3f3f3f3f;int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> f(n, vector<int>(3, -N));auto g = f;f[0][0] = -prices[0], g[0][0] = 0;for (int i = 1; i < n; i++){for (int j = 0; j < 3; j++){f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]);g[i][j] = g[i - 1][j];if (j - 1 >= 0) g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i]);}}int ret = 0;for (int i = 0; i < 3; i++){ret = max(ret, g[n - 1][i]);}return ret;}
};

8. 买卖股票的最佳时机 IV

题目链接

  1. 状态表示

    还是分为两个子状态

    f[i][j]表示到i位置买入状态第j次买股票的最大利润

    g[i][j]表示到i位置卖出状态第j次买股票的最大利润

  2. 状态转移方程

    image-20230726205442099

  3. 初始化

    f[0][0] = -prices[0], g[0][0] = 0

  4. 填表

    从上到下,从左到右

  5. 返回值

    返回所有行的最大值

AC代码:

class Solution {
public:const int N = 0x3f3f3f3f;int maxProfit(int k, vector<int>& prices) {int n = prices.size();vector<vector<int>> f(n, vector<int>(k + 1, -N));auto g = f;f[0][0] = -prices[0], g[0][0] = 0;for (int i = 1; i < n; i++){for (int j = 0; j <= k; j++){f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]);g[i][j] = g[i - 1][j];if (j - 1 >= 0) g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i]);}}int ret = 0;for (int i = 0; i <= k; i++){ret = max(ret, g[n - 1][i]);}return ret;}
};

相关文章:

【动态规划】简单多状态

文章目录 动态规划&#xff08;简单多状态&#xff09;1. 按摩师2. 打家劫舍 ||3. 删除并获得点数4. 粉刷房子5. 最佳买卖股票时机含冷冻期6. 买卖股票的最佳时机含手续费7. 买卖股票的最佳时机 |||8. 买卖股票的最佳时机 IV 动态规划&#xff08;简单多状态&#xff09; 1. 按…...

科技资讯|苹果计划本月推出Vision Pro头显开发套件,电池有重大更新

根据消息源 aaronp613 分享的信息&#xff0c;苹果计划本月底面向开发者&#xff0c;发布 Vision Pro 头显开发套件。消息源还指出苹果更新了 Vision Pro 头显电池组的代号&#xff0c;共有 A2781&#xff0c;A2988 和 A2697 三种不同的型号&#xff0c;目前尚不清楚三者之间的…...

k8s 将pod节点上的文件拷贝到本地

要将 Kubernetes&#xff08;k8s&#xff09;中 Pod 节点上的文件拷贝到本地&#xff0c;可以通过使用 kubectl cp 命令来实现。kubectl cp 命令允许你在本地系统和 Pod 之间复制文件和目录。 下面是使用 kubectl cp 命令的语法&#xff1a; kubectl cp <namespace>/&l…...

Git简介与工作原理:了解Git的基本概念、版本控制系统和分布式版本控制的工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…...

java篇 类的进阶0x02:方法重载

文章目录 方法重载 overload方法签名返回值不属于方法签名的原因&#xff1a; 重载的参数匹配规则 方法重载 overload 多个方法功能很相似&#xff0c;但不完全一样&#xff0c;可以考虑使用方法的重载。 同一个类中&#xff0c;方法可以重名&#xff0c;但是签名不可以重复。…...

Android11 相机拍照权限,以及解决resolveActivity返回null

一、配置拍照和读写权限 <uses-permission android:name"android.permission.CAMERA"/> <uses-feature android:name"android.hardware.camera" /><uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&…...

MAXENT模型的生物多样性教程

详情点击链接&#xff1a;基于MAXENT模型的生物多样性生境模拟与保护优先区甄选、自然保护区布局优化及未来气候变化下评估中的应用及论文写作 一&#xff1a;生物多样性保护格局与自然保护区格局优化 1.我国生物多样性格局与分布&#xff1b; 2.我国自然保护区格局与分布&…...

CISA学习笔记-第一章、信息系统审计过程

传统的审计三方关系理论指明&#xff0c;审计作为独立于会计记录之外的一项重要职能&#xff0c;是公司财务信息公允可靠的有力保障&#xff0c;制约着会计行为&#xff0c;制衡了会计权力。 1. IS审计和保障标准、指南、工具 职业道德规范 信息技术保证框架&#xff08;ITAF&a…...

回调函数的使用:案例一:c语言简单信号与槽机制。

系列文章目录 文章目录 系列文章目录前言一、回调函数1.1 回调函数基本概念1.2 简单实现 二、代码案例1.代码示例 总结 前言 了解回调函数的基本概念&#xff0c;函数指针的使用、简单信号与槽的实现机制&#xff1b; 一、回调函数 1.1 回调函数基本概念 回调函数就是一个通…...

python matplotlib库 设置字体字号等

主要是记录字体、字号对应的参数。注意字符串类型的参数要加引号 1.字体&#xff1a; fontname 常见参数&#xff1a; # 常用 Times New Roman、Dejavu sans、TeX Gyre Schola中文字体 黑体&#xff1a;SimHei 微软雅黑&#xff1a;Microsoft YaHei 微软正黑体&#xff1a;M…...

【MySQL】SQL性能分析 (七)

&#x1f697;MySQL学习第七站~ &#x1f6a9;本文已收录至专栏&#xff1a;MySQL通关路 ❤️文末附全文思维导图&#xff0c;感谢各位点赞收藏支持~ 假如我们需要对SQL进行优化&#xff0c;我们就必须对他足够的了解&#xff0c;比如 对哪一类SQL进行优化&#xff08;增删改查…...

超越想象的GPT医疗 20230723

7月份读完了这本书&#xff0c;趁着周末写下读书笔记吧 这本书 作者&#xff1a;【美】彼得.李 Peter Lee 【美】凯丽.戈德伯格CareyGoldberg 著 【美】伊萨克.科恩Isaac Kohane 芦义 译 在AI风起云涌时代&#xff0c;在这刚刚过去的新冠三年&#xff0c;“超越想象的GPT医…...

【N32L40X】学习笔记03-gpio输出库

gpio输出 该函数库的目的就是在统一的地方配置&#xff0c;将配置的不同项放置在一个结构体内部使用一个枚举来定义一个的别名 led.c #include <stdio.h> #include "led/bsp_led.h"static led_t leds[LED_NUM]{{GPIOB,GPIO_PIN_2,RCC_APB2_PERIPH_GPIOB},{GP…...

WebClient,HTTP Interface远程调用阿里云API

HTTP Interface Spring 允许我们通过定义接口的方式&#xff0c;给任意位置发送 http 请求&#xff0c;实现远程调用&#xff0c;可以用来简化 HTTP 远程访问。需要webflux场景才可 <dependency><groupId>org.springframework.boot</groupId><artifactId&…...

飞书ChatGPT机器人 – 打造智能问答助手实现无障碍交流

文章目录 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 在飞书中创建chatGPT机器人并且对话&#xff0c;在下面操作步骤中…...

React、Vue框架如何实现组件更新,原理是什么?

引言 React 和 Vue 都是当今最流行的前端框架,它们都实现了组件化开发模式。为了优化性能,两者都采用了虚拟DOM技术。当组件状态发生改变时,它们会使用虚拟DOM进行局部渲染比对,只更新必要的DOM节点,从而避免重新渲染整个组件树。本文将从React和Vue的组件更新原理入手,剖析两…...

常见面试题之设计模式--策略模式

1. 概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿&#xff0c;开发需要选择一款开发工具&#xff0c;当然可以进行代码开发的工具有很多&#xff0c;可以选择Idea进行开发&a…...

redis多key问题

多key问题指的是在Redis中存在大量的key&#xff0c;如果这些key过多&#xff0c;超过了Redis可以容纳的内存大小&#xff0c;那么数据会被保存在交换空间&#xff08;swap区&#xff09;&#xff0c;这会导致性能下降。 Redis是一种基于内存的缓存数据库&#xff0c;它的性能…...

kafka第三课-可视化工具、生产环境问题总结以及性能优化

一、可视化工具 https://pan.baidu.com/s/1qYifoa4 密码&#xff1a;el4o 下载解压之后&#xff0c;编辑该文件&#xff0c;修改zookeeper地址&#xff0c;也就是kafka注册的zookeeper的地址&#xff0c;如果是zookeeper集群&#xff0c;以逗号分开 vi conf/application.conf 启…...

2_Apollo4BlueLite中断控制器NVIC

1.概述 Apollo4BlueLite 的中断控制器是采用 ARM Cortex-M4 内核&#xff0c;并集成了 NVIC&#xff08;Nested Vectored Interrupt Controller&#xff0c;嵌套向量中断控制器&#xff09;作为其中断控制器。 NVIC 是 ARM Cortex-M 系列处理器中常用的中断控制器&#xff0c…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

验证redis数据结构

一、功能验证 1.验证redis的数据结构&#xff08;如字符串、列表、哈希、集合、有序集合等&#xff09;是否按照预期工作。 2、常见的数据结构验证方法&#xff1a; ①字符串&#xff08;string&#xff09; 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...

鸿蒙Navigation路由导航-基本使用介绍

1. Navigation介绍 Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏、内容区和工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&#xff08;Nav…...