状态机模型——AcWing 1057. 股票买卖 IV

news2024/11/16 9:48:50

状态机模型

定义

动态规划中的算法状态机模型是一种用于描述算法执行过程中状态变化的模型。它由状态、事件、动作和转移组成。状态表示算法在某个时刻所处的情况,事件是导致状态发生变化的原因,动作是在状态变化时执行的操作,转移则定义了状态之间的转换关系。

注意事项

  1. 确保状态和事件的定义清晰明确,避免歧义。
  2. 考虑所有可能的状态和事件,以确保模型的完整性。
  3. 对状态转移进行仔细设计,确保其正确性和合理性。
  4. 在实现算法时,要正确处理状态的变化和相应的动作。

算法状态机模型可以帮助我们更好地理解和设计复杂的算法,尤其适用于具有多个状态和复杂控制流程的问题。通过清晰地描述状态和状态之间的转换,可以提高算法的可读性、可维护性和正确性。

解题思路

  1. 定义状态:确定算法可能处于的不同状态。
  2. 确定事件:识别导致状态变化的事件。
  3. 定义动作:描述在每个状态下执行的操作。
  4. 绘制状态机图:使用图形表示状态、事件、动作和转移之间的关系。
  5. 实现算法:根据状态机图编写代码来实现算法。

保证状态的合理性与正确性

  1. 清晰定义状态和事件:明确每个状态的含义和可能的事件,确保状态和事件的定义准确无误。
  2. 绘制状态机图:通过图形化的方式展示状态机模型,有助于直观地理解状态转移关系,发现潜在的问题。
  3. 设计合理的状态转移规则:仔细考虑每个状态下可能的事件和相应的状态转移,确保转移规则符合实际情况和业务需求。
  4. 进行边界情况和异常情况的处理:考虑状态机在边界情况和异常情况下的行为,确保它能够正确处理这些情况,避免出现错误的状态转移。
  5. 验证和测试:使用测试用例对状态机进行验证和测试,确保在各种情况下状态转移的正确性和合理性。
  6. 审查和评审:让其他团队成员对状态机模型进行审查和评审,他们可能会发现一些潜在的问题或提出改进建议。
  7. 持续改进:在使用状态机的过程中,不断总结经验教训,发现问题并及时进行改进。
  8. 参考已有模型:可以参考已有的类似状态机模型,借鉴其设计经验和最佳实践。
  9. 使用工具支持:有些工具可以帮助设计和验证状态机模型,例如状态机图绘制工具和模型验证工具。
  10. 考虑并发和异步情况:如果状态机涉及并发或异步操作,需要特别注意状态转移的正确性和合理性,避免竞态条件和死锁等问题。

AcWing 1057. 股票买卖 IV

题目描述

1057. 股票买卖 IV - AcWing题库

运行代码

#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int M = 110, INF = 0x3f3f3f3f;
int n, m;
int f[M][2];

int main()
{
    cin >> n >> m;
    f[0][0] = 0;
    for (int i = 1; i <= n; i ++ )
    {
        int w;
        cin >> w;
        for (int j = 1; j <= m; j ++ )
        {
            if(i == 1) f[j][1] = -w;
            else
            {
                f[j][0] = max(f[j][0], f[j][1] + w);
                f[j][1] = max(f[j][1], f[j - 1][0] - w);
            }
        }
    }
    cout << f[m][0] << endl;
    return 0;
}

代码思路

  • 定义了一些常量和变量,包括最大数量 M,无穷大表示 INF,以及问题中的 n(天数)和 m(最多交易次数)。
  • f[M][2] 这个二维数组用于存储状态,f[j][0] 表示在进行了 j 次交易且当前不持有股票时的最大利润,f[j][1] 表示在进行了 j 次交易且当前持有股票时的最大利润。
  • 在输入天数和交易次数后,开始遍历每一天。
  • 对于每一天,如果是第一天,直接初始化 f[j][1] 为 -w(即买入股票的成本)。
  • 对于不是第一天的情况,通过两个状态转移方程来更新状态:f[j][0] = max(f[j][0], f[j][1] + w) 表示当前不持有股票的最大利润可能来自于保持之前的状态或者卖出当前持有的股票;f[j][1] = max(f[j][1], f[j - 1][0] - w) 表示当前持有股票的最大利润可能来自于保持之前的持有状态或者买入新的股票(用之前不持有股票且少一次交易的利润减去买入成本)。
  • 最后输出 f[m][0],即进行了 m 次交易且最终不持有股票时的最大利润。

其它代码

#include <iostream>
#include <cstring>
using namespace std;

const int N = 100010, M = 110;

int n, k;
int a[N], f[N][M][2];

int main()
{
    memset(f, -0x3f, sizeof f);
    cin >> n >> k;
    for(int i = 1; i <= n; i ++ ) cin >> a[i];
    for(int i = 0; i <= n; i ++ ) f[i][0][0] = 0;
    for(int i = 1; i <= n; i ++ )
        for(int j = 1; j <= k; j ++ )
        {
            f[i][j][0] = max(f[i - 1][j][0], f[i - 1][j][1] + a[i]);
            f[i][j][1] = max(f[i - 1][j][1], f[i - 1][j - 1][0] - a[i]);
        }
    int res = 0;
    for(int i = 0; i <= k; i ++ ) res = max(res, f[n][i][0]);
    cout << res << endl;
}

代码思路

  • 定义了一些常量,包括数组最大长度 N 和最大交易次数 M
  • 输入股票价格序列的长度 n 和最大交易次数 k,并读取股票价格数组 a[N]
  • 通过 memset 初始化三维数组 f[N][M][2] 的所有值为较小值。
  • 特别地,将 f[i][0][0](即没有进行任何交易且不持有股票时)初始化为 0。
  • 然后通过三层循环进行动态规划计算:
    • 对于每一个位置 i 和交易次数 j,计算 f[i][j][0](当前不持有股票的最大利润),它可以是上一步不持有股票的最大利润,或者是上一步持有股票并在当前卖出的利润(加上当前价格)。
    • 计算 f[i][j][1](当前持有股票的最大利润),它可以是上一步持有股票的利润,或者是上一步没有持有股票且少一次交易然后在当前买入的利润(减去当前价格)。
  • 最后在所有结束状态中(即 n 位置和不同交易次数的不持有股票状态)找出最大利润值并输出。

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

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

相关文章

1.2 离散LTI系统的时域分析

目录 离散系统的定义 离散LTI系统的时域描述h[k] 离散系统的分类 线性与非线性系统 时变与非时变系统 因果与非因果系统 稳定与不稳定系统 例题 LTI——Linear and Time-invariant System 线性时不变系统 离散系统的定义 离散LTI系统的时域描述h[k] 离散系统的…

关于“刘亦菲为什么无人敢娶”的问题❗❗❗

关于“刘亦菲为什么无人敢娶”的问题&#xff0c; 实际上涉及到多个方面的因素&#xff0c; 以下是对这些因素的详细分析&#xff1a;1.事业心重&#xff1a;刘亦菲作为华语影视圈的知名女星&#xff0c;她的演艺事业非常成功&#xff0c; 这也意味着她将大量的时间和精力投…

深圳网页设计收费情况

深圳是中国最具活力和发展速度最快的城市之一&#xff0c;随着经济的快速发展&#xff0c;各种行业都飞速发展&#xff0c;尤其是互联网行业。网页设计是互联网行业的重要组成部分&#xff0c;深圳的网页设计师数量也是非常庞大的。那么&#xff0c;深圳网页设计师的收费情况是…

HarmonyOS ArkUi Tabs+TabContent+List实现tab吸顶功能

Demo效果 Entry Component struct StickyNestedScroll {State message: string Hello WorldState arr: number[] []scroller new Scroller()StyleslistCard() {.backgroundColor(Color.White).height(72).width("100%").borderRadius(12)}build() {Scroll(this.sc…

Java 项目的构建工具 Maven

Maven 一、Maven 简介二、Maven 安装配置1、Maven 下载安装2、Maven 配置 三、IDEA 集成 Maven四、Maven 依赖管理1、依赖配置2、依赖传递3、依赖范围4、生命周期 五、Maven 高级特性1、分模块设计与开发2、Maven 继承3、Maven 版本管理4、Maven 聚合5、私服 一、Maven 简介 M…

[Centos7] 部署Zabbix5.0

目录 0 卸载 Zabbix1 准备工作1.1 关闭防火墙1.2 关闭SELinux1.3 重启服务器1.4 安装MySQL 2 配置 Zabbix yum 源2.1 安装zabbix的软件仓库配置包2.2 安装 Software Collections 仓库2.3 修改 Zabbix 仓库配置文件 3 安装 Zabbix3.1 遇到报错Requires: libmysqlclient.so.183.2…

Verilog进行结构描述(二):Verilog基本单元(primitives)

目录 1.Verilog基本单元2.基本单元的引脚 (pin)的可扩展性3.带条件的基本单元4.基本单元实例化 微信公众号获取更多FPGA相关源码&#xff1a; 1.Verilog基本单元 Verilog基本单元提供基本的逻辑功能&#xff0c;也就是说这些逻辑功能是预定义的&#xff0c;用户不需要再定义…

爬虫-Python基础

一、Python环境的安装 1. 下载Python 访问Python官网: Welcome to Python.org点击downloads按钮&#xff0c;在下拉框中选择系统类型(windows/Mac OS/Linux等)选择下载最新版本的Python 2. 安装Python 双击下载好的Python安装包勾选左下角 Add Python 3.7 to PATH 选项&…

超声波清洗机对眼镜有伤害吗?四大顶尖优品公认力作!

超声波清洗机利用超声波在液体中产生的微小气泡爆炸&#xff0c;产生强大的冲击力&#xff0c;能够深入物品的各个角落&#xff0c;有效去除油污、灰尘和细菌。与传统的手工清洗相比&#xff0c;不仅清洁效率高&#xff0c;而且能够保护眼镜不受损伤&#xff0c;特别适合清洗眼…

我国氮化硼市场规模逐渐扩大 市场集中度有望不断提升

我国氮化硼市场规模逐渐扩大 市场集中度有望不断提升 氮化硼&#xff08;BN&#xff09;俗称为白石墨&#xff0c;是由硼原子和氮原子所构成的一种晶体材料&#xff0c;在常温条件下多表现为一种棕色或暗红色晶体。氮化硼具有导热性好、硬度大、熔点高、抗化学侵蚀性等优点&…

室内蓝牙导航定位技术独特的优势

随着科技的飞速发展&#xff0c;人们对定位服务的需求已经从室外扩展到了室内。传统的GPS定位技术在室外环境中表现出色&#xff0c;但在室内环境下&#xff0c;由于信号受到建筑物结构的遮挡和干扰&#xff0c;其定位效果大打折扣。因此&#xff0c;室内定位技术应运而生&…

阿贝云免费虚拟主机与免费云服务器评测

阿贝云作为一家知名的云服务提供商&#xff0c;其免费虚拟主机和免费云服务器备受用户青睐。免费虚拟主机提供了大量的资源和功能&#xff0c;在网站建设和运营中发挥了重要作用。用户可以轻松地搭建自己的网站&#xff0c;并享受稳定的服务。免费云服务器则为用户提供了更强大…

白鲸开源中标人保集团2024年数据调度工具软件产品及服务采购项目

近日&#xff0c;北京白鲸开源科技有限公司成功中标中国人民保险集团&#xff08;以下简称“中国人保”&#xff09;2024年数据调度工具软件产品及服务采购项目。此举将为中国人保提供高性能、高可用性、高扩展性和高安全性的一站式数据调度管理方案&#xff0c;大力推进中国人…

2024-6-27 石群电路-31

2024-6-27&#xff0c;星期四&#xff0c;12:52&#xff0c;天气&#xff1a;雨&#xff0c;心情&#xff1a;晴。今天没有什么事情发生&#xff0c;继续学习&#xff0c;加油&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 今日观看了石群老师电路课程的视频…

sql查询CONCAT、group_concat、concat_ws函数用法

SELECT str_code, 1 CONCAT 连接多字段字符串就模糊查询 select CONCAT(dept_name, , dept_code , , parent_id) ,* from sys_dept where CONCAT(dept_name, , dept_code , , parent_id) LIKE %16% 2、语法&#xff1a;group_concat( [distinct] 要连接的字段 [order by …

计算机Java项目|基于SpringBoot的基于保密信息学科平台系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

IaaS,PaaS,SaaS理解

目前主流的IaaS&#xff0c;PaaS&#xff0c;SaaS产品 一、简述应用方案 这里借用汽车的例子对IaaS、PaaS、SaaS的解释进一步阐述三者的区别。 假设你需要出去外出使用交通工具&#xff0c;我们有四种的方案&#xff1a; On-premise&#xff08;本地部署服务&#xff09; 自己…

Java日志 - JUL

一、JUL学习总结 &#xff08;1&#xff09;总结 JDK自带的日志系统中已经为我们创建了一个顶层的RootLogger&#xff0c;可以针对这个顶层的RootLogger设置多个Handler&#xff08;如ConsoleHandler, FileHandler等&#xff09;&#xff0c;如果想在控制台输出debug级别以上的…

AI论文降重:一键操作,让你的论文查重率瞬间下降

高查重率是许多毕业生的困扰。通常&#xff0c;高查重率源于过度引用未经修改的参考资料和格式错误。传统的降重方法&#xff0c;如修改文本和增添原创内容&#xff0c;虽必要但耗时且成效不一。 鉴于此&#xff0c;应用AI工具进行AIGC降重成为了一个高效的解决方案。这些工具…

gin-vue-amdin 新增路由

1&#xff1a;在api目录的example 下新建controller 层如下图&#xff08;&#xff09;&#xff1a; 在enter.go 中 加入 这个新建的结构体&#xff1a; 2&#xff1a;在router 的example 文件夹下 新建对应的路由文件 3&#xff1a;在initlize 的router 中 添加对应的代码&a…