首页 > 其他分享 >[UOJ#748] [UNR#6] 机器人表演

[UOJ#748] [UNR#6] 机器人表演

时间:2023-10-04 21:45:11浏览次数:30  
标签:UNR 01 匹配 748 机器人 int UOJ hehe dp

在这个科技发达的年代,真人表演已经落伍了。参加完 UOI 后,hehe 蚤去到了下山市大剧院,观看下山市最火爆的机器人表演。

机器人有时比人类更能抓住事情的本质。所谓表演,其实也就是开场有若干个机器人,中间有时一些机器人出现,有时一些机器人消失,最后谢幕还剩若干个机器人的过程。

hehe 蚤得到了一份公开的节目单。这份节目单介绍了按照时间顺序的一些事件。事件共有两种,一种是“某个机器人出现在了舞台上”,另一种是“某个机器人从舞台上消失了”。

但节目单上没有记录开场时会有多少个机器人,也没有记录谢幕时会有多少个机器人。

除此之外,还有 $t$ 个临时安排的机器人会来这次表演。hehe 蚤并不知道他们何时会来,何时会消失(但它们一定会来也一定会消失)。

hehe 蚤决定按照时间顺序记录整个表演。他会用 0 表示一个机器人出现在舞台上,用 1 表示一个机器人从舞台上消失,如此形成一个 01 串。

在表演开始前,hehe 蚤想知道最终 01 串共有多少种可能性。答案对 $998244353$ 取模。

简要题意:

有一个长为 $n$ 的 01 串,你需要计算 $t$ 次操作后能得到多少不同的 01 串。

一次操作的定义为:在串中选两个位置插入一对 01 使得 01 前。

对于所有数据,保证 $1 \leq n, t \leq 300$。

dp 题,先考虑如何判定一个串是否可以操作出来。

贪心的话,考虑能去匹配原串的就去匹配原串,不能匹配的就去凑 01.记一下现在前面有多少个 0 没有匹配。

然后发现如果前面没有 0 不能匹配了,但是又有一个 1 要去匹配,这个时候我们只能撤回那些拿去匹配原串的字符,找一个最大的 \(i\) 使得撤回原串中 \(i\) 后面的所有 01 后,有多的 0 可以拿来匹配这个 1.这个可以暴力去找。

然后考虑把上面反悔贪心的过程记到 dp 里面。定义 \(dp_{i,j,k}\) 为前 \(i\) 个数,和原串匹配了 \(j\) 位,有 \(k\) 个 0 没有匹配 1,然后按着上面的反悔贪心去转移就可以了。

#include<bits/stdc++.h>
using namespace std;
const int N=305,P=998244353;
int f[N],h[N],n,t,dp[N*3][N][N];//dp[i][j][k] 表示现在到了i,匹配到j,前面有k个0
char s[N];
int main()
{
	scanf("%d%d%s",&n,&t,s+1);
	for(int i=n;i;i--)
	{
		int c=0;
		for(int j=i;j<=n;j++)
		{
			if(s[j]=='0')
				++c;
			else
				--c;
			if(c<0)
				break;
			if(!f[j]&&c)
				f[j]=i,h[j]=c;
		}
	}
	dp[0][0][0]=1;
	for(int i=0;i<n+2*t;i++)
	{
		for(int j=0;j<=n;j++)
		{
			for(int k=0;k<=t;k++)
			{
				if(j^n)
				{
					(dp[i+1][j+1][k]+=dp[i][j][k])%=P;
					if(s[j+1]=='0')
					{
						if(k)
							(dp[i+1][j][k-1]+=dp[i][j][k])%=P;
						else if(f[j])
							(dp[i+1][f[j]-1][h[j]-1]+=dp[i][j][k])%=P;
					}
					else
						(dp[i+1][j][k+1]+=dp[i][j][k])%=P;
				}
				else 
				{
					(dp[i+1][j][k+1]+=dp[i][j][k])%=P;
					if(k)
						(dp[i+1][j][k-1]+=dp[i][j][k])%=P;
					else if(f[j])
						(dp[i+1][f[j]-1][h[j]-1]+=dp[i][j][k])%=P;
				}
			}
		}
	}
	printf("%d",dp[n+2*t][n][0]);
}

标签:UNR,01,匹配,748,机器人,int,UOJ,hehe,dp
From: https://www.cnblogs.com/mekoszc/p/17742799.html

相关文章

  • SWERC 2022-2023 - Online Mirror (Unrated, ICPC Rules, Teams Preferred)
    Preface纯纯的智商场,只能说老外的出题风格和国内的比赛差异还是挺大的这场开局被签到题H反杀后灰溜溜地下机,结果后面的题出的都还挺顺的等到最后徐神把J过掉后我们都以为D是个大分类讨论(实际上机房里的学长们都是用分类讨论过的),就不想写了挂机到结束后面看题解发现确实是分类......
  • Git解决 fatal: refusing to merge unrelated histories
    一、fatal:refusingtomergeunrelatedhistories新建了一个本地仓库之后,把本地仓库和远程仓库进行关联提交、拉取的时候,出现了如下错误:二、解决方案在你的操作命令后面加--allow-unrelated-histories例如:$gitpulloriginmaster--allow-unrelated-historie......
  • BUUOJ[ACTF2020 新生赛]Include 1
    原理文件包含伪协议的利用解题过程靶场进入发现一个超链接,点了一下发现跳转到了flag.php文件传递了参数file=flag.php。猜测应该是文件包含。文件包含读取文件源码要想到伪协议了。--要多补补了payload:?file=php://filter/read=convert.base64-encode/resource=flag.php......
  • [题解]CF1748C Zero-Sum Prefixes
    UPD23.10.3更新的对思路的描述,以及代码。思路对于每一个\(a_i=0\),如果我们将它变为\(x\),都可以直接将\(i\simn\)位置上的前缀和加\(x\)。设\(a_j\)是\(a_i\)后第一个\(0\),那么,在\(j\)时同样有上述规律。所以,我们只需在\(i\)时考虑,\(i\sim(j-1)\)的贡......
  • unriad折腾记录
    这几天想做个云电脑能够在线编程打游戏,记录下这几天的折腾体验windosIntelGVT-g:windows虚拟机我推荐使用IntelGVT-g插件,注意点就是启动项和bios不能选错,其他就正常绑定,用vnc就行但是用这个插件有个大坑就是虚拟机内存占用很高,而且显卡不能释放共享内存。容易死机核显:......
  • BUUOJ[极客大挑战 2019]Havefun 1
    原理url参数的传递页面原代码的查看解题过程进入靶场没看到什么有用的东西,那就得看页面源代码了,一般都有提示果然,让我们传递值为dog的cat参数,试一下payload:?cat=dog爆出flag......
  • BUUOJ[极客大挑战 2019]EasySQL 1
    原理涉及sql注入的or万能登录解题过程看到题目名字,应该就是要用到sql注入了,进入网页,看到了要登陆,我一开始想到要爆破(呃呃呃)。要用sql去登录的话,就要想到or万能登录了payload:1'or1=1#账号密码都是字符型的注入,因此有时候需要尝试一下'和"接着就爆出flag了另外,我在url......
  • 使用MounRiver进行FPU配置
    MCU使用FPU时,MRS需要进行配置,具体配置方式如下图:开启硬件浮点MRS具体配置-Properties->C/C++Build->Setting->TargetProcessor->Floatingpoint选项配置成Singleprecisionextension(RVF)FloatingpointABI选项配置成Singleprecision(f)此外,还需要按照下图配置......
  • MounRiver使用技巧及配置2
    1、关于调试模式下ecall和ebreak指令无效的解释说明调试模式下ebreak会是断点,直接停在此处,单步可跳过。ecall会触发中断进入HardFault_Handler 2、关于MRS编译同时输出hex文件和bin文件按照下图添加即可:${cross_prefix}${cross_objcopy}${cross_suffix}-Obinary"${ProjNa......
  • MounRiver Studio软件使用配置技巧
    ---------------------------------------------------------------------------------------------------------------------1、改变工具栏中图标大小的设置由于MounRiverStudio工具栏中的图标过于太小,导致操作时出现容易点错图标,使得在开发过程中带来不必要的麻烦。为了解决......