状态机模型

news2024/11/8 10:22:24

文章目录

    • 一、大盗阿福
    • 二、股票买卖 IV
    • 三、股票买卖 V
    • 四、设计密码
      • 4.1kmp题目
      • 4.2设计密码

一、大盗阿福

题目链接
在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int f[N][2];
int main()
{
    int t, n;
    cin >> t;
    
    while(t --)
    {
        cin >> n;
        for(int i = 1;i <= n;i ++)
        {
            //f[i, 0]表示不抢第i家店铺
            //f[i ,1]表示要抢第i家店铺
            int money;
            cin >> money;
            f[i][0] = max(f[i - 1][0],f[i - 1][1]);
            f[i][1] = f[i - 1][0] + money;
        }
        printf("%d\n",max(f[n][0],f[n][1]));
    }
    return 0;
}

二、股票买卖 IV

题目链接
在这里插入图片描述
在这里插入图片描述

对于状态机模型来说,你刚开始所处的位置初始化为0(一般来说),其他位置一般初始化为无穷大,对于该题来说你要初始化为负无穷

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5 + 10, INF = 1e9, M = 110;
int n,k;
int f[N][M][2];

int main()
{
    cin >> n >> k;
    memset(f, -0x3f, sizeof f);
    for (int i = 0; i <= n; i ++ ) f[i][0][0] = 0;//j为0时代表你一次交易没有完成
    for(int i = 1;i <= n;i ++)
    {
        int m;
        cin >> m;
        for(int j = 1;j <= k;j ++)
        {
            f[i][j][0] = max(f[i - 1][j][1] + m, f[i - 1][j][0]);
            f[i][j][1] = max(f[i - 1][j - 1][0] - m,f[i - 1][j][1]);
        }
    }
    int res = 0;
    for(int i = 1;i <= k;i ++) res = max(res, f[n][i][0]);
    cout << res;
    return 0;
}

三、股票买卖 V

题目链接
在这里插入图片描述

这个题加了一个冷冻期的状态,其实和上一题差不多,没什么区别
多加了一种状态而已
入口是冷冻期

在这里插入图片描述

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int f[N][3];
int n;

int main()
{
    memset(f, -0x3f, sizeof f);
    f[0][2] = 0;//1代表你处于卖出状态,2代表你处于冷冻期
    cin >> n;
    for(int i = 1;i <= n;i ++ )
    {
        int w;
        cin >> w;
        f[i][0] = max(f[i - 1][2] - w, f[i - 1][0]);
        f[i][1] = f[i - 1][0] + w;
        f[i][2] = max(f[i - 1][1],f[i - 1][2]);
    }
    cout << max(f[n][1],f[n][2]);
    return 0;
}

四、设计密码

4.1kmp题目

这个题要用到kmp,先说说kmp,抽象理解,简写代码

具体理解请看我的这篇博客(kmp算法细节详解)

首先我们要理解kmp是算法的作用是进行子串的匹配,也就是根据子串的前缀和后缀最大能够匹配的字符串个数

图解:

在这里插入图片描述
在这里插入图片描述

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

const int N = 1e5 + 10, M = 1e6 + 10;
char p[N], s[M];
int ne[N];

int main()
{
    int n,m;
    cin >> n >> p + 1 >> m >> s + 1;
    //先求模式串next数组
    for(int i = 2, j = 0;i <= n;i ++)
    {
        while(j && p[i] != p[j + 1]) j = ne[j];
        if(p[i] == p[j + 1]) j ++;
        
        ne[i] = j;//j 前面是前缀,后面到i是后缀
    }
    
    for(int i = 1, j = 0;i <= m;i ++)//遍历主串
    {
        while(j && s[i] != p[j + 1]) j = ne[j];
        if(s[i] == p[j + 1]) j ++;
        
        if(j == n)
        {
            printf("%d ", i - n);
            j = ne[j];
        }
    }
    return 0;
}

4.2设计密码

题目链接
在这里插入图片描述

题解摘自E.lena在这里插入图片描述在这里插入图片描述
在这里插入图片描述

这里f[i + 1][u] 为什么还要加上自己,因为这个f[i + 1][u] 可能含有由其他状态转移转移过来

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

using namespace std;

const int N=55,mod=1e9+7;

int f[N][N],ne[N];
char str[N];//子串

int main()
{
    int n,m;
    cin>>n>>str+1;
    m=strlen(str+1);

    for(int i=2,j=0;i<=m;i++)//求出ne数组(kmp模板)
    {
        while(j&&str[j+1]!=str[i]) j=ne[j];
        if(str[j+1]==str[i]) j++;
        ne[i]=j;
    }

    f[0][0]=1;//已经匹配了0位,且匹配的子串的位置是0时的方案数为1;(初始化)
    for(int i=0;i<n;i++)//枚举密码位
     for(int j=0;j<m;j++)//把第i位密码匹配到的子串位置都枚举一遍
     //j表示第i位密码匹配到的位置,因为不能包含子串,所以不能匹配到m这个位置
      for(char k='a';k<='z';k++)//把第i+1所有可能的字母都枚举一遍
       {
           //匹配过程:寻找当第i+1的位置是k时,并且密码已经生成了第i位,匹配的子串的位置是j时,能跳到哪个位置
           int u=j;
           while(u&&str[u+1]!=k) u=ne[u];
           if(str[u+1]==k) u++;

           if(u<m) f[i+1][u]=(f[i+1][u]+f[i][j])%mod;
           //因为是从f[i][j](i+1的位置为k)跳到f[i+1][u]这个位置,所以f[i+1][u]=f[i+1][u]+f[i][j];
           /*
           注:可能存在重边,因为j不同但ne[j]是相同的,并且k是相同的,所以此时
           f[i][j1]和f[i][j2]跳到的位置是一样的(k相同,ne[j1]=ne[j2])
           */
       }

    int res=0;
    for(int i=0;i<m;i++) res=(res+f[n][i])%mod;
    //将所有的方案数加起来即为总方案数
    printf("%d",res);

    return 0;
}

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

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

相关文章

用户统计开发思路

1. 需求分析 所谓用户统计&#xff0c;实际上统计的是用户的数量。通过折线图来展示&#xff0c;上面这根蓝色线代表的是用户总量&#xff0c;下边这根绿色线代表的是新增用户数量&#xff0c;是具体到每一天。所以说用户统计主要统计两个数据&#xff0c;一个是总的用户数量&…

我开源了一个短视频应用(Go+React)|DouTok2.0 项目介绍

前言 大家好&#xff0c;这里是白泽&#xff0c;拖更了一段时间&#xff0c;抱歉。在 DouTok2.0 可以初步允许大家接入开发之后&#xff0c;这篇文章才得以出炉。 DouTok&#xff1a;一个开源的 web 端的短视频应用&#xff0c;采用微服务架构&#xff0c;包含前后端&#xff…

JavaEE初阶---网络原理之TCP篇(二)

文章目录 1.断开连接--四次挥手1.1 TCP状态1.2四次挥手的过程1.3time_wait等待1.4三次四次的总结 2.前段时间总结3.滑动窗口---传输效率机制3.1原理分析3.2丢包的处理3.3快速重传 4.流量控制---接收方安全机制4.1流量控制思路4.2剩余空间大小4.3探测包的机制 5.拥塞控制---考虑…

玩转HF/魔搭/魔乐社区

下载依赖 下载指定文件 玩转HF/魔搭/魔乐社区 1. 闯关任务 &#x1f600;Hello大家好&#xff0c;这节课为大家带来“玩转HF/魔搭/魔乐社区”的课程&#xff0c;课程任务请访问闯关任务 2. 课程内容 &#x1f600;Hello大家好&#xff0c;欢迎来到书生大模型实战营第四期…

ReactNative Fabric渲染器和组件(5)

ReactNative Fabric渲染器和组件 简述 Fabric是ReactNative中新架构最核心的模块&#xff0c;本章我们会来了解一下自定义一个Fabric组件&#xff0c;然后在JS文件中声明之后如何&#xff0c;是怎么映射到原生构建一个View的。 关于Fabric架构理念官网已经有说明了&#xff0…

DataSophon集成ApacheImpala的过程

注意: 本次安装操作系统环境为Anolis8.9(Centos7和Centos8应该也一样) DataSophon版本为DDP-1.2.1 整合的安装包我放网盘了: 通过网盘分享的文件&#xff1a;impala-4.4.1.tar.gz等2个文件 链接: https://pan.baidu.com/s/18KfkO_BEFa5gVcc16I-Yew?pwdza4k 提取码: za4k 1…

计算机网络-MSTP概述

一、RSTP/STP的缺陷与不足 前面我们学习了RSTP对于STP的一些优化与快速收敛机制。但在划分VLAN的网络中运行RSTP/STP&#xff0c;局域网内所有的VLAN共享一棵生成树&#xff0c;被阻塞后的链路将不承载任何流量&#xff0c;无法在VLAN间实现数据流量的负载均衡&#xff0c;导致…

字节青训-兔群繁殖之谜

问题描述 生物学家小 R 正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律&#xff1a; 每对成年兔子每个月会生育一对新的小兔子&#xff08;一雌一雄&#xff09;。新生的小兔子需要一个月成长&#xff0c;到第二个月才能开始繁殖。兔子永远不会死亡。 小 R…

uniapp写移动端,适配苹果手机底部导航栏,ios安全区问题,苹果手机遮挡底部信息,uview的u-action-sheet组件

手机上有很多组件&#xff0c;需要手机底部弹窗来做选择,picker选择器&#xff0c;select列选择器呀这些&#xff0c;在苹果手机上会被底部nav遮住 采用了好几种配置的方式&#xff0c;多多少少都不太行&#xff0c;还是采用css来做吧&#xff0c;但是css来写想让它生效&#x…

从零开始使用Surya-OCR最新版本0.6.1——最强文本检测模型:新添表单表格检测识别

目录 一、更新概述 二、环境安装 1.基础环境配置 2.模型参数下载 3.参数地址配置——settings.py 三、指令使用 1.命令指令运行 一、更新概述 surya项目Github地址&#xff1a;https://github.com/VikParuchuri/surya 号称今年最强OCR的surya近期迎来新的更新&#xff0c;Vik…

深入理解C++ Lambda表达式:语法、用法与原理及其包装器的使用

深入理解C Lambda表达式&#xff1a;语法、用法与原理及其包装器的使用 lambda表达式C98中的一个例子lambda表达式语法lambda表达式各部分说明捕获列表说明 函数对象与lambda表达式 包装器function包装器 bind &#x1f30f;个人博客主页&#xff1a; 个人主页 本文深入介绍了…

nacos介绍

Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它致力于提供发现、配置和管理微服务的统一解决方案&#xff0c;以支持构建云原生应用。 服务发现&#xff08;Service Discovery&#xff09;&#xff1a; Nacos 支持服务的动态注册与发现&#xff…

【操作系统实验课】Git操作基础

1. Windows系统 1.1. Git下载安装 下载 Git 访问 Git 官方网站:https://git-scm.com/。 在页面中找到适合 Windows 系统的下载链接,一般会有 “Windows” 字样的按钮,点击下载安装程序。 安装 Git 运行下载的安装程序。 在安装向导中,一般可以选择默认设置,也可以根…

搜维尔科技:Xsens动作捕捉、Manus数据手套和Faceware面部捕捉技术集成,应用于元宇宙数字人制作解决方案

Xsens动作捕捉、Manus数据手套和Faceware面部捕捉技术集成&#xff0c;能够实现非常逼真且高效的数字人动作和表情捕捉&#xff01; 硬件连接与数据传输方面&#xff1a; 1.Xsens与Manus的集成&#xff1a;Xsens惯性动作捕捉系统通常可以与Manus的数据手套直接集成。Xsens主要…

MQTTnet4.3.x服务端+客户端实例测试(服务端和客户端方法及参数)

一、示例 目的&#xff1a;学习MQTTnet4.x使用方法&#xff0c;网上很多方法都是3.x版本介绍 二、方法调用 2.1 服务端 2.2 客户端 结合上篇博文&#xff0c;实现与多客户端进行交流&#xff08;实现在线客服功能&#xff09; 当然还有其他方法。之前曾写过相关MQTT文章&#…

【WebDriver】浏览器驱动下载及其配置

一、Windows电脑环境搭建-Chrome浏览器 行业内&#xff0c;Chrome (谷歌) 浏览器对于自动化程序来讲是比较稳定的. 自动化程序推荐使用 Chrome 浏览器的原因有几个&#xff1a; 开发者工具&#xff1a;Chrome 提供强大的开发者工具&#xff0c;方便调试和测试自动化脚本。 稳…

用jest做单元测试不得不知道的起手式配置,闭坑指南

做单元测试有很多的工具&#xff0c;今天在一个老项目中看到的用的工具是用的jest做的单元测试&#xff0c;特尝试更新下&#xff0c;遇到不少的问题。 相关依赖配置文件 npm install --save-dev jestpackage.json {"name": "jest-app","version&qu…

【Android】多渠道打包配置

目录 简介打包配置签名配置渠道配置配置打包出来的App名称正式包与测试包配置 打包方式开发工具打包命令行打包 优缺点 简介 多渠道打包 是指在打包一个 Android 应用时&#xff0c;一次编译生成多个 APK 文件&#xff0c;每个 APK 文件针对一个特定的渠道。不同的渠道可能代表…

Linux初学者导引:掌握主要命令与操作系统基础(第一天)

本文使用的工具&#xff1a;CentOS。 1.打开终端&#xff1a; 鼠标单击右键&#xff0c;选择“在终端打开(E)”选项。 2.命令行基础 常用命令&#xff1a; &#xff08;1&#xff09;ls:列出目录内容 列出当前目录或指定目录中的文件和文件夹。 基本用法&#xff1a;ls常…

块设备驱动的基本概念

块设备与字符设备 块设备只能以块为单位接收输入和返回输出&#xff0c;而字符设备则以字节为单位。大多数设备是字符设备&#xff0c;因为它们不需要缓冲而且不以固定块大小进行操作&#xff1b;字符设备只能被顺序读写&#xff0c;而块设备可以随机访问。 块设备对于I/O请求…