【算法笔记】状态机dp

状态机dp概述

当一个事件涉及的过程的考虑并且方案数的考虑比较繁琐时,我们可以尝试用状态机的思想去考虑这个问题,将这个问题简化,就是去考虑一个对象他所具有的几种状态。

状态机主要考虑一下两个方面:状态和转移

状态其实也就是正常在dp过程中分析的,不用过多解释了。

转移:状态与状态之间的转移,根据实际题目,分析状态与状态之间是否能转移,能转移的就画一根箭头。最后会发现其实就是一个有向图。

触发机制

样题:股票买卖IV

 
状态含义:f[i, j, 0]表示前i个股票,已经进行完j次交易,且手中没有买入时的最大收益;
 f[i, j, 1]表示前i个股票,已经进行完 j - 1次交易,且已经买入第j个股票但还没卖出时的最大收益。

关于初始化:因为在最开始,我们任何一笔交易都没有产生,并且手中也没有任何股票,也就不能个进行卖出的操作。所以我们第一次操作就是从0变到1(买入股票)或继续保持0(不买股票)。所以我们直接将f[ i ][ 0 ][ 0 ]初始化为0。这样就完成了每个数据点的初始化,避免了不合法的方案进行转换。


         


#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;
const int N = 100010, M = 110;
int f[N][M][2];
int n, k;
int w[N];int main()
{cin>>n>>k;for(int i = 1; i <=n; i ++) cin>>w[i];memset(f, -0x3f, sizeof f);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][1] + w[i], f[i - 1][j][0]);f[i][j][1] = max(f[i - 1][j][1], f[i-1][j-1][0] - w[i]);}}int res = 0;for(int i = 0; i <= k; i ++){res = max(res, f[n][i][0]);}cout<<res;
}

样题2:股票买卖V

思考:这题和上面那题最大不同就是,这里可以进行无限多次交易,同时多了一个状态。这一题中共有三个状态:手中持有股票,刚刚卖出股票那一天,卖出股票天数大于等于2天。

状态转移的分析过程就和上一题思路类似。照着图把转移方程写出来。

 

#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;
const int N = 100010;
int f[N][3];
int n;
int w[N];int main()
{cin>>n;for(int i = 1; i <= n; i ++) cin>>w[i];memset(f, -0x3f, sizeof f);f[0][2] = 0;for(int i = 1; i <= n; i ++){f[i][0] = max(f[i-1][0], f[i - 1][2] - w[i]);f[i][1] = f[i-1][0] + w[i];f[i][2] = max(f[i-1][1], f[i-1][2]);}cout<<max(f[n][1],f[n][2]);
}

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

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

相关文章

UWB灵犀遥控器方案介绍

关键字&#xff1a;UWB技术、遥控器三维定位、遥控器指向操控 系统介绍&#xff1a;UWB灵犀遥控器&#xff0c;基于UWB TOF测距和AOA测角原理。显示器端可以同时定位遥控器的位置和朝向。实现使用遥控器指向屏幕&#xff0c;即可隔空触控&#xff0c;在大屏上实现滑动、拖拽、点…

一文带你弄懂 V8 数组的快速 / 字典模式

V8 是如何处理数组的&#xff1f; 问题 先抛出一个问题&#xff0c;下面两端代码哪个的效率更高&#xff1f; const arr []; for(let i 0; i < 10000000; i) {arr[i] 1; }const arr []; arr[10000000 - 1] 1; for(let i 0; i < 10000000; i) {arr[i] 1; }答案是…

Unsafe类

Unsafe类 Unsafe类中的重要方法 JDK的rt.jar包中的Unsafe类提供了硬件级别的原子性操作&#xff0c;Unsafe类中的方法都是native方法&#xff0c;它们使用JNI的方式访问本地C实现库。下面我们来了解一下Unsafe提供的几个主要的方法以及编程时如何使用Unsafe类做一些事情。 l…

江科大STM32

目录 STM32简介 STM32简介 我们主要学习的就是STM32的外设。 NVIC&#xff1a;内核里面用于管理中断的设备&#xff0c;比如配置中断优先级这些东西SysTick&#xff1a;内核里面的定时器&#xff0c;主要用来给操作系统提供定时服务的&#xff0c;STM32是可以加入操作系统的&am…

OpenSource - 基于Netty的网络扩展库HServer

文章目录 概述官网Hserver的理念特点原理图代码案例HelloWorld 概述 HServer是一个基于Netty开发网络扩展库.使用插件方式来扩展我们的业务 HServer提供 web,gateway,rpc 等插件 同时用户也可以自定义插件&#xff0c;来完成各种各样的业务场景。 官网 https://gitee.com/HSe…

OpenGuass 之顺序扫描和索引扫描的代价估算

一. 前言 在OepnGuass中&#xff0c;一条路径的执行代价估算值将直接决定一条路径是否会被取舍。本文主要对OpenGuass中对于普通表的顺序扫描和索引扫描两种路径的的代价估算进行代码走读了解代价估算的整体过程。 二. 顺序扫描代价估算 顺序扫描的路径代价估算在OpenGuass中实…

如何找到 niche 出海细分市场的 IDEA

先说结论就是&#xff1a;看榜单 Why&#xff1a;为什么看榜单&#xff1f; 大家会问为什么&#xff1f;原因很简单&#xff1a; 熟读唐诗三百首&#xff0c;不会作诗也会吟不天天看榜单上相关的优秀同行&#xff0c;你想干啥 心法就是下苦功夫坚持&#xff0c;量变引起质变…

经典八股文之RocketMQ

核心概念 NameServer nameserver是整个rocketmq的大脑&#xff0c;是rocketmq的注册中心。broker在启动时向所有nameserver注册。生产者在发送消息之前先从 NameServer 获取 Broker 服务器地址列表(消费者一 样)&#xff0c;然后根据负载均衡算法从列表中选择一台服务器进行消…

通用web自动扩缩容_智能运维引擎CudgX

一、概述 CudgX是星汉未来自主研发的面向云原生时代的智能运维引擎&#xff0c;支持根据 MetricQPS 分段耗时指标进行自动扩缩容。 通过各类服务的多维度、大规模的日志数据采集以及机器学习训练分析&#xff0c;对服务进行数字化、指标化度量&#xff0c;并基于部署的…

现有网络模型的使用及修改(VGG16为例)

VGG16 修改默认路径 import os os.environ[TORCH_HOME] rD:\Pytorch\pythonProject\vgg16 # 下载位置太大了&#xff08;140多G&#xff09;不提供直接下载 train_set torchvision.datasets.ImageNet(root./data_image_net, splittrain, downloadTrue, transformtorchvis…

PHP文件代码加密系统,可批量全开源

代码文件加密系统 在程序运行时&#xff0c;实质上是在执行机器码&#xff0c;而虚拟机语言的基本概念是将程序加密到一定程度&#xff0c;也就是说&#xff0c;经过加密的PHP程序在执行时会被解密成opcode继续执行。 PHP在执行时会生成opcode&#xff0c;然后由Zend虚拟机继…

PiflowX组件 - Filter

Filter组件 组件说明 数据过滤。 计算引擎 flink 组件分组 common 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子conditioncondition“”无是过滤条件。age > 50 or age < 20 Filter示例…