【agc013d】AtCoder Grand Contest 013 D - Piling Up

题意

盒子里有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]\)

posted @ 2018-03-02 19:34  hiweibolu  阅读(129)  评论(0编辑  收藏  举报