2024百度之星第一场-110串

补题链接: 码蹄集

三个状态转移的计数dp

先确定状态

n个数至多修改k次,保证不出现字串“110”

常规想法先把状态确定为dp[n][k][0/1],前n个数,修改k次后,末尾数为0/1,不能转移再换思路。

初始状态设定如下:

dp[1][(s[1]=='0')?0:1][0]=1;
dp[1][(s[1]=='1')?0:1][1]=1;

即,第一个数的所有状态处理,比如s[1]==‘1’,那么状态就是dp[1][0][1]=1,dp[1][1][0]=0。

考虑状态转移 

我们需要避免出现110,考虑第i位,第i-1位,第i-2位之间的关系。

首先很自然的想法,如果第i位是1,那么无论前面两位取什么,结果都是满足的,全部加起来,即:dp[i][j][1]=dp[i][j或j-1][1]+dp[i][j或j-1][0];

这个修改数量取j还是j-1取决于假定末尾和实际末尾是否一致,所以我们可以这么写

int p1_1=(s[i]=='1'?0:1);
dp[i][j][1]=dp[i-1][j-p1_1][1]+dp[i-1][j-p1_1][0];

 这种情况就是XX1,即最后一位取1,前面两位取0或1都行。

同样的情况有下面三种:

XX1

X00

010

我们解决完了XX1,后面两种思路也是一样的,代码如下:

int p1_0=(s[i]=='0'?0:1);
int p1_1=(s[i]=='1'?0:1);
int p2_1=(s[i-1]=='1'?0:1);
dp[i][j][1]=dp[i-1][j-p1_1][1]+dp[i-1][j-p1_1][0];
dp[i][j][0]+=dp[i-1][j-p1_0][0]+dp[i-2][j-p1_0-p2_1][0];

其实就是当第i位为0时,之能从第i-1位为0和第i-2位为0转移过来。

状态转移就完成了,考虑三个细节:范围,取模以及滚动,最终代码如下。

#include<bits/stdc++.h>
using namespace std;
const int N=5e3+5;
char s[N];
int dp[3][N][2];//以0/1结尾 
const int mod=998244353;
int f(int x){
    return (x+3)%3;
}
void work(){
	int n,k;cin>>n>>k;
	for (int i=1;i<=n;i++){
		cin>>s[i];
	}
	dp[f(1)][(s[1]=='0')?0:1][0]=1;
	dp[f(1)][(s[1]=='1')?0:1][1]=1;
	for (int i=2;i<=n;i++){
		for (int j=0;j<=k;j++){
			int p1_0=(s[i]=='0'?0:1);
			int p1_1=(s[i]=='1'?0:1);
			int p2_1=(s[i-1]=='1'?0:1);
			dp[f(i)][j][0]=dp[f(i)][j][1]=0;
			if (i>=2&&j-p1_1>=0) dp[f(i)][j][1]=(dp[f(i-1)][j-p1_1][1]+dp[f(i-1)][j-p1_1][0])%mod;
			if (i>=2&&j-p1_0>=0) (dp[f(i)][j][0]+=dp[f(i-1)][j-p1_0][0])%=mod;
			if (i>=3&&j-p1_0-p2_1>=0) (dp[f(i)][j][0]+=dp[f(i-2)][j-p1_0-p2_1][0])%=mod;
			if (i<3&&j-p1_0>=0) (dp[f(i)][j][0]+=dp[f(i-1)][j-p1_0][1])%=mod;
		}
	}
	int ans=0;
	for (int j=0;j<=k;j++) (ans+=(dp[f(n)][j][0]+dp[f(n)][j][1])%mod)%=mod;
	cout<<ans<<"\n";
}
signed main(){
	work();
	return 0;
}

完结撒花

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Cloud Networking] BGP

1. AS (Autonomous System) 由于互联网规模庞大&#xff0c;所以网络会被分为许多 自治系统&#xff08;AS-Autonomous system&#xff09;。 所属类型ASN名称IPv4 数量IPv6数量运营商ISPAS3356LEVEL3 - Level 3 Parent, LLC, US29,798,83273,301,954,048互联网企业AS15169GO…

自适应IT互联网营销企业网站pbootcms模板

模板介绍 一款蓝色自适应IT互联网营销企业网站pbootcms模板&#xff0c;该模板采用响应式设计&#xff0c;可自适应手机端&#xff0c;适合一切网络技术公司、互联网IT行业&#xff0c;源码下载&#xff0c;为您提供了便捷哦。 模板截图 源码下载 自适应IT互联网营销企业网站…

【PyQt】20-QTimer(动态显示时间、定时关闭)

QTimer 前言一、QTimer介绍二、动态时间展示2.1 代码2.2 运行结果 三、定时关闭3.1 介绍他的两种用法1、使用函数或Lambda表达式2、带有定时器类型&#xff08;高级&#xff09; 3.2 代码3.3 运行结果 总结 前言 好久没学习了。 一、QTimer介绍 pyqt里面的多线程可以有两种实…

Windows系统开启自带虚拟机功能Hyper-V

前言 最近有小伙伴咨询&#xff1a;Windows系统上有自带的虚拟机软件吗&#xff1f; 答案肯定是有的。它就是Hyper-V&#xff0c;但很多小伙伴都不知道怎么打开这个功能。 今天小白就带大家来看看如何正确打开这个Windows自带的虚拟机功能Hyper-V。 开始之前&#xff0c;你…

统计分析利器:深入解读卡方检验与单因素方差分析的应用案例【练习题】

一、卡方检验 1.对400人进行问卷调查&#xff0c;询问对于教学改革的看法&#xff0c;调查结果如下表所示&#xff0c;请问不同学科不同性别的人意见是否相同。 学科 男生 女生 工科 80 40 理科 120 160 &#xff08;性别&#xff0c;学科均无序分类>卡方检验&am…

音视频开发32 FFmpeg 编码- 视频编码 h264 参数相关

1. ffmpeg -h 这个命令总不会忘记&#xff0c;用这个先将ffmpeg所有的help信息都list出来 C:\Users\Administrator>ffmpeg -h ffmpeg version 6.0-full_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 pro…

万字长文详解数据结构:树 | 第6章 | Java版大话数据结构 | 二叉树 | 哈夫曼树 | 二叉树遍历 | 构造二叉树 | LeetCode练习

&#x1f4cc;本篇分享的大话数据结构中&#x1f384;树&#x1f384;这一章的知识点&#xff0c;在此基础上&#xff0c;增加了练习题帮助大家理解一些重要的概念✅&#xff1b;同时&#xff0c;由于原文使用的C语言代码&#xff0c;不利于学习Java语言的同学实践&#xff0c;…

JS(JavaScript)事件处理(事件绑定)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

ChatGPT新纪元:揭秘GPT-4o的多模态能力

GPT-4o登场 探索ChatGPT的多模态创新 今日凌晨&#xff0c;OpenAI向全球宣布了AI发展的新篇章——GPT-4o&#xff0c;每次OpenAI发布重大更新时&#xff0c;尽管令人兴奋&#xff0c;但也不免使众多初创公司的梦想破灭。 GPT-4o的命名中的“o”象征着“omni”——全能的代表。…

基于线调频小波变换的一维时间序列时频分析方法(MATLAB)

在机械故障诊断领域,振动信号的处理常采用以快速傅立叶变换为基础的相关分析、幅值分析、频谱分析等时域和频域分析方法。但经典的FFT存在固有缺点,即它虽然在频域范围内是完全局部化的,但是它不包含任何时域信息,因而不适于分析非平稳信号。近年来涌现的各种时频分析方法(短时…

ros1仿真导航机器人 hector_mapping gmapping

仅为学习记录和一些自己的思考&#xff0c;不具有参考意义。 1 hector_mapping 建图过程 &#xff08;1&#xff09;gazebo仿真 roslaunch why_simulation why_slam.launch <launch><!-- We resume the logic in empty_world.launch, changing only the name of t…

c++习题04-忙碌的工人

目录 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;图形 2&#xff0c;分析 3&#xff0c;伪代码 三&#xff0c;代码 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;图形 根据题目&#xff0c;绘制出来的图形如下&#x1f447; 之后再绘制甲经过楼梯…

面试-J.U.C包的梳理

1.J.U.C包的梳理 Java.Util.Concurrent包简称JUC (1)JUC整体架构图 (2)分析 Executor&#xff1a;线程执行器&#xff0c;任务执行和调度的框架。Tools下存在executor相关的executors类&#xff0c;用于创建executorservice&#xff0c;scheduleexecutorservice&#xff0c;…

解决json日期格式问题

解决json日期格式问题 1.json默认输出时间格式 RequestMapping("/json3") public String json3() throws JsonProcessingException {ObjectMapper mapper new ObjectMapper();//创建时间一个对象&#xff0c;java.util.DateDate date new Date();//将我们的对象解…

clion ctrl+左键只能跳转到虚函数的声明处

右击函数 -> GOTO -> Definition 这样不够便捷&#xff0c;但是我没有找到更好的办法 可能是因为该函数是虚函数的重写&#xff0c;clion 无法识别出该函数是虚函数的哪个重写版&#xff0c;只能跳转到唯一的虚函数位置

<电力行业> - 《第7课:发电》

1 发电的原理 电力生产的发电环节是利用电能生产设备将各种一次能源或其他形式的能转换为电能。生产电能的主要方式有火力发电、水力发电、核能发电、地热发电、风力发电、太阳能发电、潮汐能发电、生物智能发电和燃料电池发电等。 除太阳能发电的光伏电池技术和燃料电池发电…

【C++】哈希表 --- 闭散列版本的实现

在无人问津日子里 正是登峰造极的好时机 ——《人民日报》 哈希表 --- 闭散列版本的实现 1 C中的哈希表2 哈希表底层2.1 功能2.1 哈希冲突2.3 开散列与闭散列 3 闭散列版本的实现3.1 框架搭建3.2 仿函数设计3.3 插入函数3.4 查找函数3.5 删除函数 Thanks♪(&#xff65;ω&a…

# [0628] Task04 DQN 算法及进阶

easy-rl PDF版本 笔记整理 P6 - P8 joyrl 比对 补充 P7 - P8 相关 代码 整理 待整理 &#xff01;&#xff01; 最新版PDF下载 地址&#xff1a;https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用)&#xff1a; 链接: https://pan.baidu.com/s/1i…

vue3 window.location 获取正在访问的地址,也可以通过useRoute来获取相关信息。

1、一般我们在开发的vue3项目的时候&#xff0c;地址是这样&#xff1a;http://192.168.1.101:3100/#/login 然后我们在布署完成以后一般是这样https://xxx.yyyyy.com/uusys/#/login 其实xxx可以是www&#xff0c;也可以是一个二级域名 yyyyy.com是域名&#xff0c;uusys一般…

Kafka~消息发送过程与ISR机制了解

消息发送过程 使用Kafka发送消息时&#xff0c;一般有两种方式分别是&#xff1a; 同步发送异步发送 同步发送时&#xff0c;可以在发送消息后&#xff0c;通过get方法等待消息结果&#xff0c;这种情况能够准确的拿到消息最终的发送结果&#xff0c;要么是成功、要么是失败…