【算法|动态规划 | 线性dp | 状态机模型】AcWing1049. 大盗阿福 1058. 股票买卖 V AcWing1059. 股票买卖 VI

本文主要是介绍【算法|动态规划 | 线性dp | 状态机模型】AcWing1049. 大盗阿福 1058. 股票买卖 V AcWing1059. 股票买卖 VI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【手撕算法系列专栏】【AcWing算法提高学习专栏】
🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
🍓希望我们一起努力、成长,共同进步。

目录

  • 一、AcWing1049. 大盗阿福
    • 题目解析
    • 解题代码
  • 二、AcWing1058. 股票买卖 V
    • 题目解析
    • 解题代码
  • 三、AcWing1059. 股票买卖 VI
    • 题目解析
    • 解题代码

一、AcWing1049. 大盗阿福

原题链接:点击直接跳转到该题目

题目解析

我们本题用到了两个一维dp表分别是f[i]g[i]

状态表示:

  • f[i]:表示偷窃第i家所能窃取的最大值
  • g[i]:表示不偷窃第i家所能窃取的最大值

状态转移方程:

  • f[i] = max(g[i - 1] + arr[i])
  • g[i] = max(f[i - 1],g[i - 1])

返回值:

  • max(f[n],g[n])

解题代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const int N  = 1e5 + 10;int main()
{int T;cin >> T;while(T--){int f[N],g[N],arr[N];int n;cin >> n;for(int i = 1;i <= n;i++) cin >> arr[i];// dp初始化f[1] = arr[1];for(int i = 1;i <= n;i++){f[i] = g[i - 1] + arr[i];g[i] = max(f[i - 1],g[i - 1]);}cout << max(f[n],g[n]) << endl;}
}

二、AcWing1058. 股票买卖 V

原题链接:点击直接跳转到该题目

题目解析

状态表示(dp[0/1/2][i]):

  • 0表示第i天结束后处于卖出状态,即手上没有股票
  • 1表示第i天结束后处于买入状态,即手上右股票
  • 2表示第i天结束后处于冷冻期(我们这里就可以理解为此时的第i天这一整天是处于冷冻期的)

返回值(结果值):

  • dp[0][n]

解题代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;- List itemconst int N = 1e5 + 10;
int prices[N];
int dp[3][N]; // 0表示卖出状态,1表示买入状态,2表示冷冻期int main()
{int n;cin >> n;for(int i = 1;i <= n;i++) cin >> prices[i];// dp初始化dp[1][1] = -prices[1];for(int i = 2;i <= n;i++) {dp[0][i] = max(dp[0][i - 1],dp[1][i - 1] + prices[i]);dp[1][i] = max(dp[1][i - 1],dp[2][i - 1] - prices[i]);dp[2][i] = dp[0][i - 1];}printf("%d\n",dp[0][n]);return 0;
}

三、AcWing1059. 股票买卖 VI

原题链接:点击直接跳转到该题目

题目解析

状态表示dp[0/1][i]0表示第i天结束后没有手上没有股票;1表示第i天结束后手上有股票。

  • dp[0][i]:表示第i天结束后手上没有股票的最大利益。
  • dp[1][i]:表示第i天结束后手上有股票的最大利益。

状态转移方程:

  • dp[0][i] = max(dp[0][i - 1],dp[1][i - 1]) + prices[i] - f
  • dp[1][i] = max(dp[1][i - 1],dp[0][i - 1] - prices[i])

返回值(即最终结果值):

  • 由于最终手中一定是没有股票的,所以最后的结果值为dp[0][n]

解题代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const int N = 1e5 + 10;
int prices[N];
int dp[2][N];int main()
{int n,f;scanf("%d %d",&n,&f);for(int i = 1;i <= n;i++) cin >> prices[i];dp[1][1] = -prices[1];for(int i = 2;i <= n;i++){dp[0][i] = max(dp[0][i - 1],dp[1][i - 1] + prices[i] - f);dp[1][i] = max(dp[1][i - 1],dp[0][i - 1] - prices[i]);}printf("%d\n",dp[0][n]);return 0;
}

这篇关于【算法|动态规划 | 线性dp | 状态机模型】AcWing1049. 大盗阿福 1058. 股票买卖 V AcWing1059. 股票买卖 VI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/310020

相关文章

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

基于Canvas的Html5多时区动态时钟实战代码

《基于Canvas的Html5多时区动态时钟实战代码》:本文主要介绍了如何使用Canvas在HTML5上实现一个多时区动态时钟的web展示,通过Canvas的API,可以绘制出6个不同城市的时钟,并且这些时钟可以动态转动,每个时钟上都会标注出对应的24小时制时间,详细内容请阅读本文,希望能对你有所帮助...