【agc013d】AtCoder Grand Contest 013 D - Piling Up

本文探讨了一个关于盒子里有n块砖(红蓝两色),执行m次操作后可能出现的不同颜色序列数量的问题。通过设置状态转移方程,考虑序列中起始蓝砖数的影响,最终得出解法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

盒子里有n块砖,每块的颜色可能为蓝色或红色。
执行m次三步操作:
1.从盒子里随便拿走一块砖
2.放入一块蓝砖和红砖到盒子里
3.从盒子里随便拿走一块砖

给定n,m
问拿出来的砖,可能有多少种不同的颜色序列。

n,m<=3000

解法

容易想到一个dp,
设f[i][j]表示已经执行了i次的操作,然后目前盒子里有j块蓝砖,和n-j块红砖。
共有四种转移,分别是一次操作拿走的砖头为红红、红蓝、蓝红、蓝蓝。
边界为f[0][0..n]=1

然后就会发现算重了,
这是因为不同的颜色序列可能会有不同的起始蓝砖数。

那么我们对于一个颜色序列,我们只在它的起始蓝砖数最小的场合统计。
对于最小的起始蓝砖数,m次操作过程中一定有一时刻蓝砖数为0。
因为如果没有,说明起始蓝砖数还可以减去整个过程中的最小蓝砖数。

然后只要给f设多一维0/1表示,执行了i次操作后,有没有经过蓝砖数为0的时刻。

答案就是\(\sum f[m][i][0]\)

转载于:https://www.cnblogs.com/hiweibolu/p/8494862.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值