题解:CF1920E. Counting Binary Strings

题解:CF1920E. Counting Binary Strings

  • 题意简述

题目链接:Problem - E - Codeforces。

洛谷翻译:Counting Binary Strings - 洛谷。

  • 思路解析

假设我们有一个01串str(设里面有z个“1”),我们要求它里面有几个“好的串”。

我们不难想到,可以对它的每个元素“1”进行操作。为了方便描述,我们记s[i]为str中第i个元素“1”的前面直到离它最近的“1”之间0的数量加一。形象解释:其实就可以想象成把str分成若干份,每一份都是由前面的一堆“0”(可能没有)以及最后面的一个“1”(必须有)组成。特别的,我们记s[z+1]=1。那么很显然,对于第i个“1”,含有它的“好的串”(一定仅含有这一个“1”)的个数就是s[i]*s[i+1],其中最长的长度就是s[i]+s[i+1]-1。(左端点的可能性就是s[i]的形象解释里的这几种,右端点就是s[i+1]的形象解释里每种情况向左侧移动一位)显然每个s[i]都大于等于1。

下面给一个例子。

如上图,对于深蓝色的第一个“1”,含有它的“好的串”就有s[1]*s[2]=2*3=6个,其中左端点可以是str[1]、str[2](深蓝色),右端点可以是str[3]、str[4]、str[5](红色左移一位),总个数是乘法原理。

如上图,对于红色的第二个“1”,它所对应的“好的串”中最长的就是str[3~7],它的长度很显然红色总数+绿色总数-1,即s[2]+s[3]-1。

不难证出,每一个s数组(定义如上)都能映射出一个str(01字符串)。于是,求出相应要求的字符串的数量就相当于求出对应的s的数量,这道题自然就变成了构造数组s。

我们在引入n和k。对于n,我们要保证,str子串中“好的串”的数量等于n,就相当于保证所有的s[i]*s[i+1]之和等于n;对于k,我们要保证,每一个“1”所在的“好的串”中最长的一个小于等于k,就相当于保证所有的s[i]+s[i+1]-1小于等于k。

于是题目就变成了求出满足上述条件的s的数量,我们自然而然想到DP。

状态:f[x][y]表示目前为止所有的s[i]*s[i+1]的和为i,最后一个s[i]为y,满足该条件的s的数量。

初值:f[0][x]=1。(如果一个数都没有,可以假设最前面的数是啥都行)

转移:f[x][y]=f[x-y*z][z]。(假设倒数第二个数为y,为了符合“n”的条件,上一次+y*z=x,所以上一次的总和是x-y*z;还有一个问题是z的范围,为了让它不越界,需保证x-y*z>=0,所以1≤z≤x/y,又需要满足“k”的要求,需保证y+z-1≤k,所以1≤z≤min(x/y,k+1-y))

时间代价:遍历第一维——线性O(n);遍历第二维——线性O(k);遍历z——调和级数O(log(k));总共O(nk*log(k)),完美通过。

  • 代码展示
#include<bits/stdc++.h>
#define K 2750
#define N 2750
using namespace std;
const long long mod=998244353;
long long f[N][K]={};
int k=0,n=0,t=0;
int main(){scanf("%d",&t);while(t--){scanf("%d%d",&n,&k);for(int i=0;i<=n;i++){for(int j=1;j<=k;j++){f[i][j]=0;}}for(int i=1;i<=k;i++){f[0][i]=1;}for(int i=1;i<=n;i++){for(int j=1;j<=k;j++){for(int kk=1;kk<=min(i/j,k+1-j);kk++){f[i][j]=(f[i][j]+f[i-j*kk][kk])%mod;}}}long long ans=0;for(int i=1;i<=k;i++){ans=(ans+f[n][i])%mod;}printf("%lld\n",ans);}return 0;
}
  • 死亡提示

f赋初值不要用memset,要用for。

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

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

相关文章

【MySQL进阶】视图_存储过程_存储函数_触发器

文章目录 视图基本介绍视图操作视图创建视图查询视图修改视图删除 存储过程基本介绍基本操作存储语法变量IF语句参数传递CASEWHILEREPEATLOOP游标 存储函数触发器基本介绍基本操作 总结 视图 基本介绍 视图概念&#xff1a;视图是一种虚拟存在的数据表&#xff0c;这个虚拟的表…

透明拼接屏在汽车领域的应用

随着科技的进步&#xff0c;透明拼接屏作为一种新型的显示技术&#xff0c;在汽车领域的应用越来越广泛。尼伽小编将围绕透明拼接屏在汽车本身、4S店、展会、工厂等方面的应用进行深入探讨&#xff0c;并展望未来的设计方向。 一、透明拼接屏在汽车本身的应用 车窗显示&#x…

Python入门(一)

anaconda安装 官网&#xff1a;https://www.anaconda.com下载 jupyter lab 简介&#xff1a; 包含了Jupyter Notebook所有功能。 JupyterLab作为一种基于web的集成开发环境&#xff0c;你可以使用它编写notebook&#xff0c;操作终端&#xff0c;编辑markdown文本&#xf…

Linux中文件属性的获取(stat、chmod、Istat、fstat函数的使用)

修改文件权限 函数如下&#xff1a; chmod/fchmod函数用来修改文件的访问权限: #include <sys/stat.h> int chmod(const char *path, mode_t mode); int fchmod(int fd, mode_t mode); 成功时返回0&#xff1b;出错时返回EOF 注意&#xff1a;在vmware和windows共享的文…

NetSuite 文心一言(Ernie)的AI应用

有个故事&#xff0c;松下幸之助小时候所处的年代是明治维新之后&#xff0c;大量引用西洋技术的时期。当时大家对“电”能干什么事&#xff0c;充满好奇。“电能干什么&#xff1f;它能帮我们开门么&#xff1f;” 松下幸之助的爷爷对电不屑&#xff0c;于是就问他。松下幸之助…

【新闻感想】谈一下PandoraNext的覆灭(潘多拉Next-国内可访问的免费开放GPT共享站将于2024年1月30日关闭)

文章目录 悲报&#xff1a;TIME TO SAY GOODBYE&#xff01;PandoraNext&#xff01;PandoraNext作者言&#xff1a;你们赢了&#xff0c;但我却没有输我如何了解到PandoraNext的合照留念于是开始逆向&#xff01; 悲报&#xff1a;TIME TO SAY GOODBYE&#xff01;PandoraNext…

Java入门高频考查基础知识5(扎实技术基础应变一切变化-45题4.2万字参考答案)

技术变革裁员影响的因素&#xff1a; 自动化替代简单重复性工作&#xff1a;随着技术的发展&#xff0c;一些简单、重复性的编码任务可能被自动化工具或者机器学习算法取代。这可能导致一些岗位的需求减少或者消失&#xff0c;从而可能导致部分人员裁员。 技能更新要求&#x…

大模型日报-20240122

清华、小米、华为、 vivo、理想等多机构联合综述&#xff0c;首提个人LLM智能体、划分5级智能水平 https://mp.weixin.qq.com/s/JYB4BzsXhWF8pEUUkvn_GQ 想必这些唤醒词中至少有一个曾被你的嘴发出并成功呼唤出了一个能给你导航、讲笑话、添加日程、设置闹钟、拨打电话的智能个…

【.NET Core】深入理解异步编程模型(APM)

【.NET Core】深入理解异步编程模型&#xff08;APM&#xff09; 文章目录 【.NET Core】深入理解异步编程模型&#xff08;APM&#xff09;一、APM概述二、IAsyncResult接口2.1 BeginInvoke2.2 EndInvoke2.3 IAsyncResult属性2.4 IAsyncResult异步演示 三、通过结束异步操作来…

系统架构演变

1.1系统架构的演变 2008年以后&#xff0c;国内互联网行业飞速发展&#xff0c;我们对软件系统的需求已经不再是过去”能用就行”这种很low的档次了&#xff0c;像抢红包、双十一这样的活动不断逼迫我们去突破软件系统的性能上限&#xff0c;传统的IT企业”能用就行”的开发思…

yum下载源,vim使用

文章目录 yum本地配置lzrsz命令行互传scp(远程拷贝)vim yum本地配置 [rootiZf8z3j2ckkap6ypn717msZ ~]# pwd /root [rootiZf8z3j2ckkap6ypn717msZ ~]# ls /etc/yum.repos.d CentOS-Base.repo epel.repo //本地配置源yum会根据/etc/yum.repo.d路径下的配置文件来构成自己的下载…

人类行为动作数据集大合集

最近收集了一大波关于人类行为动作的数据集&#xff0c;主要包括&#xff1a;动作识别、行为识别、活动预测、动作行为分类等数据集。废话不多说&#xff0c;接下来就给大家介绍这些数据集&#xff01;&#xff01; 1、用于自动视频编辑的视频Blooper数据集 用于自动视频编辑…

idea中debug Go程序报错error layer=debugger could not patch runtime.mallogc

一、问题场景 在idea中配置了Go编程环境&#xff0c;可以运行Go程序&#xff0c;但是无法debug&#xff0c;报错error layerdebugger could not patch runtime.mallogc: no type entry found, use ‘types’ for a list of valid types 二、解决方案 这是由于idea中使用的d…

SpringBoot统一返回和统一异常处理

Session 认证和 Token 认证 过滤器和拦截器 SpringBoot统一返回和统一异常处理 上篇文章我们学习了基于 Token 认证的登录功能实现&#xff0c;分别使用了过滤器和拦截器去实现登录功能&#xff0c;这篇文章我们来学习项目中常用的统一返回结果和统一异常处理。 一、统一返…

【LeetCode每日一题】670. 最大交换

2024-1-22 文章目录 [670. 最大交换](https://leetcode.cn/problems/maximum-swap/)思路&#xff1a; 670. 最大交换 思路&#xff1a; 从后往前遍历整数的字符数组&#xff0c;找到第一个比当前最大值小的数字&#xff0c;然后将该数字与最大值进行交换。 将给定的整数转换为…

数据库-分库分表初探

文章目录 分库策略垂直切分垂直分库&#xff08;专库专用&#xff09;垂直分表&#xff08;拆表&#xff09;优点缺点 水平(Sharding)切分水平分表库内分表分库分表优点缺点 分表策略hash取模方案range范围区间取值方案映射表方案 分库分表问题事务一致性问题跨节点关联查询跨节…

浅谈拨测在网络安全中的应用

在当今数字化时代&#xff0c;网络安全成为各个行业和组织关注的焦点。为了保障网络的稳定性和信息的安全&#xff0c;拨测安全性成为一种日益重要的工具。本文将介绍拨测在网络安全中的应用&#xff1a; 1.威胁模拟 通过威胁模拟&#xff0c;拨测安全性可以模拟各种网络攻击&a…

初谈C++:命名空间、输入输出

文章目录 前言C关键字命名空间命名空间的作用命名空间定义命名空间的使用 C的输入&输出 前言 什么是C&#xff1f; C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#…

mockjs(3)

mockjs&#xff08;1&#xff09; mockjs&#xff08;2&#xff09; 这篇主要是Mock.random工具类&#xff0c;前段要用的话主要是在模版中的占位符。mockjs&#xff08;1&#xff09;里面的3.2 6 Mock.random Mock.Random 是一个工具类&#xff0c;用于生成各种随机数据。 …

Wpf 使用 Prism 实战开发Day15

用户登录和注册接口 一.创建用户登录注册控制器&#xff08;LoginController&#xff09; /// <summary>/// 用户登录注册控制器/// </summary>[ApiController][Route("api/[controller]/[action]")]public class LoginController: ControllerBase{} 二.…