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;
}

完结撒花

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

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

相关文章

存储请求地址但是使用时请求的是端口

baseURL默认全局加载一次&#xff0c;后续直接读取缓存 解决方案&#xff1a;

类和对象(封装、继承、多态、友元)

c面相对象的三大特性为&#xff1a;封装、继承、多态 c 认为万事万物都皆为对象&#xff0c;对象上有其属性和行为 一、类和对象&#xff08;封装&#xff09; &#xff08;一&#xff09;封装的意义 封装是c面相对象的三大特性之一 封装的意义&#xff1a; 将属性和行为…

网页如何快速被收录?

其实就是要要吸引搜索引擎爬虫更快地抓取你的网页&#xff0c;想让爬虫爬取网页&#xff0c;首要做的自然是创建并提交站点地图。站点地图是搜索引擎了解你网站结构的重要工具。它可以帮助爬虫更快地发现和抓取你网站上的所有重要页面。通过Google Search Console提交站点地图&…

6. 较全的Open3D点云数据处理(python)

注意&#xff1a;以下内容来自博客爆肝5万字❤️Open3D 点云数据处理基础&#xff08;Python版&#xff09;_python 点云 焊缝-CSDN博客&#xff0c;这篇博客写的全且详细&#xff0c;在这里是为了记笔记方便查看&#xff0c;并非抄袭。 1.点云的读写 代码如下&#xff1a; …

ARM功耗管理软件之软件栈及示例

安全之安全(security)博客目录导读 思考:功耗管理软件栈及示例?WFI&WFE?时钟&电源树?DVFS&AVS?

ubuntu22.04速装中文输入法

附送ubuntu安装chrome wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i google-chrome-stable_current_amd64.deb

python中pip换源

目录 1. 背景2. Python 的 pip 换源2.1 临时换源&#xff08;命令行中使用参数&#xff09;2.2 永久换源&#xff08;修改配置文件&#xff09;2.2.1 Windows系统2.2.2 Linux/macOS系统 2.3 使用 pip-config 命令换源&#xff08;Linux/macOS 特定&#xff09; 3. 常用的 PyPI …

深入分析 Android BroadcastReceiver (七)

文章目录 深入分析 Android BroadcastReceiver (七)1. 高级应用场景1.1 示例&#xff1a;动态权限请求1.2 示例&#xff1a;应用内通知更新 2. 安全性与性能优化2.1 示例&#xff1a;设置权限防止广播攻击2.2 示例&#xff1a;使用 LocalBroadcastManager2.3 示例&#xff1a;在…

三分钟给AI Agent应用对话增加人类情感!

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

[算法]——堆排序(C语言实现)

简单的介绍一下用堆排序的算法对整形数据的数据进行排序。 一、堆的概念 堆是具有下列性质的完全二叉树&#xff1a;每个结点的值都大于或等于其左右孩子节点的值&#xff0c;称为大顶堆&#xff1b;或者每个结点的值都小于或等于其左右孩子结点的值&#xff0c;称为小顶堆。 …

GenAI 用于客户支持 — 第 1 部分:构建我们的概念验证

作者&#xff1a;来自 Elastic Chris Blaisure 欢迎来到 Inside Elastic 博客系列&#xff0c;我们将展示 Elastic 的内部运营如何解决实际业务挑战。本系列将揭示我们将生成式 AI&#xff08;gererative AI - GenAI&#xff09;集成到客户成功和支持运营中的历程&#xff0c;让…

ctfshow web入门 sqli-labs web517--web524

web517 注入点id ?id-1’union select 1,2,3– 确认是否能够注入 ?id-1union select 1,database(),3-- 爆出库名 security爆出表名 ?id-1union select 1,(select group_concat(table_name) from information_schema.tables where table_schemasecurity),3-- emails,refer…

几个常见的FPGA问题之序列发生器、编码器、D触发器

几个常见的FPGA问题之序列发生器、编码器、D触发器 语言 :Verilg HDL 、VHDL EDA工具: Vivado 几个常见的FPGA问题之序列发生器、编码器、D触发器一、引言二、背景1、序列发生器(Sequence Generator)2、编码器(Encoder)3、D触发器(D Flip-Flop)二、问题及解决方案1. 序…

二进制方式部署consul单机版

1.consul的下载 mkdir -p /root/consul/data && cd /root/consul wget https://releases.hashicorp.com/consul/1.18.0/consul_1.18.0_linux_amd64.zip unzip consul_1.18.0_linux_amd64.zip mv consul /usr/local/bin/ 2.配置文件 // 配置文件路径&#xff1a; /roo…

将深度相机的实时三维坐标数据保存为excel文档

一、如何将数据保存为excel文档 1.excel文件库与相关使用 &#xff08;1&#xff09;导入相应的excel文件库&#xff0c;导入前先要进行pip安装&#xff0c;pip install xlwt import xlwt # 导入用于创建和写入Excel文件的库 (2) 建立一个excel文档&#xff0c;并在第0行写…

web安全渗透测试十大常规项(一):web渗透测试之Fastjson反序列化

渗透测试之Java反序列化 1. Fastjson反序列化1.1 FastJson反序列化链知识点1.2 FastJson反序列化链分析1.3.1 FastJson 1.2.24 利用链分析1.3.2 FastJson 1.2.25-1.2.47 CC链分析1.3.2.1、开启autoTypeSupport:1.2.25-1.2.411.3.2.2 fastjson-1.2.42 版本绕过1.3.2.3 fastjson…

C++调试技巧总结

1.调试准备 常用调试 Crash调试 调试信息&#xff1a; Windows系统&#xff1a;符号单独PDB文件/链接时生成&#xff0c;从外部的符号服务器下载。&#xff08;微软&#xff09; LInux&#xff1a; 调试符号与目标模块在一个文件内&#xff0c;编译时产生调试信息。模块发布时…

手机数据恢复篇:如何在OPPO中恢复永久删除的视频?

说到丢失重要的记忆&#xff0c;如何在OPPO设备中恢复永久删除的视频是一个经常困扰许多用户的话题。意外删除重要视频的情况并不少见&#xff0c;对许多人来说&#xff0c;意识到它们已经消失可能很困难。但是&#xff0c;在正确的指导、方法和工具的帮助下&#xff0c;可以找…

运行CDN

背景 CDN代码&#xff0c;调试运行 日常 git clone代码配置虚拟环境 puthon3.8,pip install r requirements.txt改项目数据集路径&#xff0c;在hico.py文件里面 # PATHS {# train: (root / images / train2015, root / annotations / trainval_hico.json),# val: …

性能优化:Java垃圾回收机制深度解析 - 让你的应用飞起来!

文章目录 一、什么是垃圾回收二、Java 内存区域划分三、垃圾回收算法1. 标记-清除&#xff08;Mark-Sweep&#xff09;算法2. 复制&#xff08;Copying&#xff09;算法3. 标记-整理&#xff08;Mark-Compact&#xff09;算法4. 分代收集&#xff08;Generational Collecting&a…