状态机模型与题目详解acm_t

本文深入探讨了状态机模型的概念及其在编程中的应用,通过多个C++实现案例,如大盗啊福、股票买卖等问题,详细解析了如何使用状态机解决实际问题。


#写在前面

状态机描述的是一系列有顺序的事件
状态机可以把事件中的各个状态描述清楚
01背包对每个物品只有选与不选,这不是一个连续的过程

状态机描述的是一个过程,不是结果

先有几种状态(几个点),每个状态之间有一些有向边(通道),状态可以通过通道转换,每一次转换相当于走了一步。
当走过k步时,可以有很多种走法。

状态机和状态压缩dp是并列的两个知识点

##大盗啊福

https://www.acwing.com/problem/content/1051/
传统的思考方式在这里插入图片描述
在这里插入图片描述
分解对于每个物品(每一步)的状态:
在这里插入图片描述
状态机的思考方式:
在这里插入图片描述
图论拆点

----c++版

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=100010,inf=0x3f3f3f3f;
int n;
int w[N],f[N][2];

int main(){
   
   
    int T;cin>>T;
    while(T--){
   
   
        cin>>n;
        for(int i=1;i<=n;i++)scanf("%d",&w[i]);
        f[0][0]=0;f[0][1]=-inf;//入口指向0,虚拟边界不可选
        for(int i=1;i<=n;i++){
   
   //对于每个物品(每一步),都有两种状态
            f[i][0]=max(f[i-1][0], f[i-1][1]);
            f[i][1]=f[i-1][0]+w[i];
        }
        printf("%d\n", max(f[n][0]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值