动态规划5,粉刷房子,买卖股票的最佳时期

粉刷房子

在这里插入图片描述

思路:

1.经验+题目要求

dp[i][0] 表示:粉刷到 i 位置的时候,最后一个位置粉刷上红色,此时的最小花费。
dp[i][1] 表示:粉刷到 i 位置的时候,最后一个位置粉刷上蓝色,此时的最小花费。
dp[i][2] 表示:粉刷到 i 位置的时候,最后一个位置粉刷上绿色,此时的最小花费。

2.状态转移方程

因为相邻两个房子颜色不能相同,所以我们粉刷下一个位置只需要 找出上一个位置粉刷另外两种颜色最小花费即可。
比如: i 位置是红色,那么 i -1 只能是蓝和绿 ,找出min(dp[i-1][1] , dp[i-1][2]);
在这里插入图片描述
3.
有 i -1 ,建表多建一行/一列,要求最小花费,初始化为0即可不影响填表
在这里插入图片描述

4 .
从左往右填表,一次填三个表

class Solution {
public:int minCost(vector<vector<int>>& costs) {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];}return min(min(dp[n][0],dp[n][1]),dp[n][2]);}
};

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

在这里插入图片描述

思路:

1.经验+题目要求

粉刷房子用颜色来表示的表,买卖股票可以用状态表示。

dp[i][0] 表示:第 i 天结束以后,处于" 买入 " 状态,此时的最大利润。
dp[i][1] 表示:第 i 天结束以后,处于" 可交易 " 状态,此时的最大利润。
dp[i][2] 表示:第 i 天结束以后,处于" 冷冻期 " 状态,此时的最大利润。

2.状态转移方程

每一个状态都可以由 另一个状态 转变成:买入 可以 从买入,可交易转换成。
例如: 买入 状态可以 当天啥也不干还是买入,也可以从可交易状态到买入,找出这两个状态的最大值即可。

在这里插入图片描述

  1. 初始化

只有买入状态的初始化,因为买入了所以为-p[0];

dp[0][0] = -p[0] , dp[0][1] = 0 , dp[0][2] = 0;

4.从左往右填写,一次填写三个表

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(n+1,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]);}
};

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

在这里插入图片描述
思路:

1.经验+题目要求

粉刷房子用颜色来表示的表,买卖股票可以用状态表示。

f[i] 表示:第 i 天结束之后,处于"买入" 状态,此时的最大利润
g[i] 表示:第 i 天结束之后,处于"卖出" 状态,此时的最大利润

注意手续费的位置,手续费的位置在从买入到卖出状态转换的位置上。
在这里插入图片描述

在这里插入图片描述
4.从左往右填写,两个表一起填

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

买卖股票的最佳时机 III

在这里插入图片描述
思路:

1.经验+题目要求
在这里插入图片描述

f[i][j] 表示:第 i 天结束之后,完成了 j 次交易,此时处于" 买入 " 状态下的最大利润
g[i][j] 表示:第 i 天结束之后,完成了 j 次交易,此时处于" 卖出 " 状态下的最大利润

状态之间的转换表达的状态转移方程和上面那几道题一样,但是,在判断 g[i][j] 的时候,需要注意j-1,j-1需要额外判断,
if(j-1) >=0 才能是 max状态转移方程,当j == 0时候,g[i][j] = g[i-1][j];

在这里插入图片描述

为了不影响max操作的比较,在第0天的时候,给第1和2次交易设为负无穷,但是又因为 上面 有g[i-1][j] - p[i] , 如果设为
INT_MIN ,就会超出范围,所以设为 -0x3f3f3f3f 。

在这里插入图片描述

4.从上往下填写每一行,两个表一起填写。

在这里插入图片描述

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> f(n,vector<int>(3));auto g = f;//f表初始化f[0][0] = -prices[0];for(int i = 1; i<3; i++){f[0][i] = -0x3f3f3f3f; //不能用INT_MIN,因为再+-都会超出极限g[0][i] = -0x3f3f3f3f;}//填表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]);if(j-1 >=0)g[i][j] = max(g[i-1][j],f[i-1][j-1]+prices[i]);elseg[i][j] = g[i-1][j];}}int ret = 0;for(int i = 0; i<3; i++){ret = max(ret,g[n-1][i]);}return ret;}
};

买卖股票的最佳时机 IV

在这里插入图片描述

同 买卖股票的最佳时机 III,就留给练习上一题了。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/717470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis开发一个分页插件、mybatis实现分页、mybatis拦截器

mybatis开发一个分页插件、mybatis实现分页、mybatis拦截器 通过官网的mybatis插件说明可知&#xff0c;我们可以通过拦截器进行开发一个插件。 例如这样的&#xff1a; UserMapper mapper sqlSession.getMapper(UserMapper.class);// 开始分页MagicPage.startPage(1, 3);//…

Linux:线程的概念

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、线程的概念线程代码的简单示例 总结 前言 本文是对于线程概念的知识总结 一、线程的概念 在课本上&#xff0c;线程是比进程更轻量级的一种指向流 或 线程是在…

VS Code 的粘性滚动预览 - 类似于 Excel 的冻结首行

VS Code 的粘性滚动预览 - 类似于 Excel 的冻结首行功能&#xff0c;即滚动 UI 显示当前源代码范围。便于在代码行数比较多的时候更好的知道自己所在的位置。粘性滚动UI 显示用户在滚动期间所处的范围&#xff0c;将显示编辑器顶部所在的类/接口/命名空间/函数/方法/构造函数&a…

理解这几个安全漏洞,你也能做安全测试

01 短信炸弹 1、漏洞描述 短信轰炸攻击是常见的一种攻击&#xff0c;攻击者通过网站页面中所提供的发送短信验证码的功能处&#xff0c;通过对其发送数据包的获取后&#xff0c;进行重放&#xff0c;如果服务器短信平台未做校验的情况时&#xff0c;系统会一直去发送短信&…

JVM内部世界(内存划分,类加载,垃圾回收)

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;JVM内部世界(内存划分,类加载,垃圾回收) 关于JVM的学习主要掌握三方面: JVM内存区的划分类加载垃圾回收 一.JVM内存区的划分 当一个Java进程开始执行时,JVM会首先向操作系统申…

实例驱动计算机网络

文章目录 计算机网络的层次结构应用层DNSHTTP协议HTTP请求响应过程 运输层TCP协议TCP协议面向连接实现TCP的三次握手连接TCP的四次挥手断开连接 TCP协议可靠性实现TCP的流量控制TCP的拥塞控制TCP的重传机制 UDP协议 网际层IP协议&#xff08;主机与主机&#xff09;IP地址的分类…

【创作回顾】17个月峥嵘创作史

#里程碑专区#、#创作者纪念日# 还记得 2022 年 10 月 05 日&#xff0c;我在CSDN撰写了第 1 篇博客——《关于测试工程师瓶颈和突围的一个思考》&#xff0c;也是我在全网发布的第一篇技术文章。 回想当时&#xff0c;这一篇的诞生过程并不轻松&#xff0c;不像是一篇网络文章…

【计算机网络】深度学习HTTPS协议

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【计算机网络】深度学习HTTPS协议 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一:HTTPS是什么二:HTTPS的工作过程三:对称加密四:非对称加密五:中间人攻击1…

【web | CTF】BUUCTF [HCTF 2018]WarmUp

天命&#xff1a;这题本地php代码是无法复现的 首先打开网站&#xff0c;啥也没有&#xff0c;查看源码 发现文件&#xff0c;打开访问一下看看&#xff0c;发现是代码审计 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whit…

【学习总结】什么是DoS和DDoS

[Q&A] 什么是DoS DoS 是 “Denial of Service”&#xff08;拒绝服务&#xff09;的缩写&#xff0c;它是一种网络攻击方式&#xff0c;其目的是使目标计算机或网络资源无法为合法用户提供正常的服务。通过向目标系统发送大量请求、消耗其带宽、处理器或内存等资源&#…

13 双口 RAM IP 核

双口 RAM IP 核简介 双口 RAM IP 核有两个端口&#xff0c;它又分为伪双端口 RAM 和真双端口 RAM&#xff0c;伪双端口 RAM 一个端口只能读&#xff0c;另一个端口只能 写&#xff0c;真双端口 RAM 两个端口都可以进行读写操作。同时对存储器进行读写操作时就会用到双端口 RAM…

unity-1

创建游戏对象&#xff08;游戏物体&#xff09; 可通过unity中的菜单栏中的Gameobject创建&#xff1b;也可在Hierarchy&#xff08;层级&#xff09;中创建&#xff0c; 双击即可居中看到。 在Hierarchy空白处右键即可看到&#xff0c;能创建游戏对象。 在Scene框中&#x…

BioTech - ADMET的性质预测 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136438192 ADMET&#xff0c;即 Absorption、Distribution、Metabolism、Excretion、Toxicity&#xff0c;吸收、分布、代谢、排泄、毒性…

Linux shell:补充命令的使用

目录 一.导读 二.正文 三.结语 一.导读 上一篇介绍了脚本的简单概念以及使用&#xff0c;现在补充一些命令。 二.正文 目前处于全局目录&#xff0c;通过mkdir创建名我为day01的文件。 通过cd命令day01 切换至day01文件当中。 使用vim文本编辑器文件名&#xff08;firstdir&…

【Python】进阶学习:pandas--query()用法详解

&#x1f4da;【Python】进阶学习&#xff1a;pandas–query()用法详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希…

LeetCode --- 无重复字符的最长子串

题目描述 无重复字符的最长子串 找到无重复的最长连续字符串。 示例1中 abc | bca | cab 都符合题意。输出3即可。 代码 可以使用暴力枚举 哈希表&#xff0c;哈希表来判断是否重复&#xff0c;枚举来判断每一种情况&#xff0c;需要开两层for循环&#xff0c;时间复杂度n…

linux高级编程:线程(二)、进程间的通信方式

线程&#xff1a; 回顾线程&#xff08;一&#xff09;&#xff1a; 1.线程间通信问题 线程间共享同一个资源&#xff08;临界资源&#xff09; 互斥&#xff1a; 排他性访问 linux系统 -- 提供了Posix标准的函数库 -- 互斥量&#xff08;互斥锁&#xff09; 原子操作&#x…

Bililive-go 实现直播自动监控录制

前言 最近有直播录制的需求&#xff0c;但是自己手动录制太麻烦繁琐&#xff0c;于是用了开源项目Bililive-go进行全自动监控录制&#xff0c;目前这个项目已经有3K stars了 部署 为了方便我使用了docker compose 部署 version: 3.8 services:bililive:image: chigusa/bilil…

javascript实现的星座查询

今天在这个网站http://xzxys.wiicha.com/看到查询星座幸运色的效果&#xff0c;想研究一下代码&#xff0c;结果右键禁用。后来参考了一下别人的代码&#xff0c;琢磨着先实现了一下星座查询的功能&#xff0c;输入月份和日期四位数后&#xff0c;可以查询属于哪个星座&#xf…

群体风暴之锤(War3地图编辑器)

文章目录 0、大致原理1、创建隐形单位2、新事件开端3、环境→新条件4、动作4.1、单位组4.1.1、圆范围内单位4.1.2、指定条件 4.2、对单位组内的所有单位释放风暴之锤 0、大致原理 真MK向目标点释放风暴之锤时选定&#xff08;以技能释放点为圆心&#xff0c;设定半径&#xff0…