【算法|动态规划 | 线性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

相关文章

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ