首页 > 其他分享 >状态机

状态机

时间:2023-02-18 15:46:49浏览次数:28  
标签:状态 int cin 状态机 using include

状态机

解析

状态机按现在的认识,可以看做一种观察问题的思路
将不同的状态看做“点”,状态之前可以转化的情况看做“边”
由此某个问题就可以变成由点和边组成的“过程”
然后根据过程来编写代码,在某些问题的理解上会更加清晰

练习

1049. 大盗阿福

思路

将选第i家店铺作为状态1,不选作为状态0。
由此,根据题目,就可以有三条边:
1.0 -> 0
2.0 -> 1
3.1 -> 0

然后将f[i]设为前i个店铺可以获取的最大价值即可

#include <iostream>
using namespace std;

const int N = 100010;
int f[N][2];

int main() {
    int T;
    cin >> T;
    while (T --) {
        int n;
        cin >> n;
        for (int i = 1; i <= n; i ++) {
            int v;
            cin >> v;
            f[i][0] = max(f[i - 1][0], f[i - 1][1]);
            f[i][1] = f[i - 1][0] + v;
        }
        
        cout << max(f[n][1], f[n][0]) << endl;
    }
    
    return 0;
}

\[\]

1057. 股票买卖 IV

思路

将题目所给状态表示为:当前手上有股票,当前手上没股票
设有为1,没有为0
状态表示为:
1.1 -> 1
2.1 -> 0
3.0 -> 0
4.0 -> 1

状态表示为:在前i天,交易进行j笔时的最大利润

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

int n, m;
const int N = 100010, M = 110;
int f[N][M][2];

int main() {
    cin >> n >> m;
    memset(f, -0x3f, sizeof f);                          //将所有状态设置为不可达
    for (int i = 0; i <= n; i ++) f[i][0][0] = 0;        //第i天,不进行交易的利润都为0
    for (int i = 1; i <= n; i ++) {
        int v;
        cin >> v;
        for (int j = 1; j <= m; j ++) {
            f[i][j][0] = max(f[i - 1][j][0], f[i - 1][j][1] + v);
            f[i][j][1] = max(f[i - 1][j][1], f[i - 1][j - 1][0] - v);
        }
    }
    
    int res = 0;
    for (int i = 0; i <= m; i ++) res = max(res, f[n][i][0]);
    cout << res << endl;
    
    return 0;
}

\[\]

1058. 股票买卖 V

思路

加入了冷冻期这个状态
设有股票为0, 没有股票第一天为1,没有股票第二天为2
则有:
1.0 -> 0
2.0 -> 1
3.1 -> 2
4.2 -> 2
5.2 -> 0

入口在没有股票的第二天,这样可以保证立刻就可以买股票,转化为0的状态
出口在没有股票的第一天和第二天,取最大值即可

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

const int N = 100010;

int f[N][3];

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

\[\]

1052. 设计密码

思路

kmp + dp

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 55, mod = 1e9 + 7;
int f[N][N];
char str[N];
int n;

int main() {
    cin >> n;
    cin >> str + 1;
    int m = strlen(str + 1);
    
    int next[N] = {0};
    
    for (int i = 2, j = 0; i <= m; i ++) {
        while (j && str[i] != str[j + 1]) j = next[j];
        if (str[i] == str[j + 1]) j ++;
        next[i] = j;
    }
    
    f[0][0] = 1;
    
    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < m; j ++) {
            for (char k = 'a'; k <= 'z'; k ++) {
                int u = j;
                while (u && k != str[u + 1]) u = next[u];
                if (k == str[u + 1]) u ++;
                if (u < m) f[i + 1][u] = (f[i + 1][u] + f[i][j]) % mod;
            }
        }
    }
    
    int res = 0;
    
    for (int i = 0; i < m; i ++) res = (res + f[n][i]) % mod;
    cout << res << endl;
    
    return 0;
}

标签:状态,int,cin,状态机,using,include
From: https://www.cnblogs.com/lbzbk/p/17132392.html

相关文章

  • 11-verilog-有限状态机
    有限状态机写RTL的时候,实现一个功能的时候有很多种方法将系统划分为多个状态,状态之间有状态的转移,第一步,第二步,,,,形成有限状态机流水线技术设计,从输入到输出有......
  • 基于Verilog HDL的状态机描述方法
    ⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合VerilogHDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。......
  • 状态机的概念与设计
    ⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合VerilogHDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。......
  • PHY状态机分析
    PHY的12种状态enumphy_state{ PHY_DOWN=0,//关闭网卡 PHY_STARTING,//PHY设备准备好了,PHYdriver尚为准备好 PHY_READY,//PHY设备注册成功 PHY_PENDING,......
  • Converting Boolean-Logic Decision Trees to Finite State Machines 如何将布尔表达
    ConvertingBoolean-LogicDecisionTreestoFiniteStateMachinesforsimpler,high-performancedetectionofcybersecurityevents将布尔逻辑决策树转换......
  • moore状态机和mealy状态机区别
    直接给出结论:根据状态机的输出是否与输入条件相关来区分Moore状态机和Mealy状态机。Moore状态机:输出仅仅与当前状态有关;如下实例,如三段式写法来写的一个序列检测的状态......
  • 状态机例子序列检测
    简介:用Verilog描述一个可综合的序列检测器用于检测输入数据码流中的特定序列(本次检测序列为10010,只要修改状态转移关系即可实现其他目标序列的检测)。当检测到10010序列(......
  • 状态机模型
    状态机描述的是状态,以前的dp是只有1个或不多个状态,现在是把状态拆分为一个过程,把一个过程用确定的状态和状态之间的关系描述出来在大盗阿福一题中,常规方法是考虑2种情况......
  • 按键扫描状态机
    voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htim->Instance==TIM10){switch(KeyState){caseKEY_CHEC......
  • Squirrel状态机-从原理探究到最佳实践
    作者:京东物流郑朋辉1简介Squirrel状态机是一种用来进行对象行为建模的工具,主要描述对象在它的生命周期内所经历的状态,以及如何响应来自外界的各种事件。比如订单的创建......