dp-水题

来源:互联网 发布:如何提升淘宝店铺销量 编辑:程序博客网 时间:2024/06/01 08:24

标题就是用来骗人的;
题意
有4种颜色:1234
我们要把n个点染色,然后依次入栈;
如果栈顶的L个点都是同色,那么L个点全部弹出;
问最后全部弹出的方案;
共T组数据;
100%的数据 n≤1000,2≤L≤10,T≤50;

【输入格式】
第一行一个整数T,表示数据组数。对于每组数据:
一行两个整数n,L,意义如上所述。
【输出格式】
T行,每行一个整数表示方案数mod 1000000007(10^9+7)的结果。
【样例输入】
4
2 2
4 2
8 5
84 4
【样例输出】
4
28
0
621871151
【样例解释】
第一组,显然只有可能是两只蛙都属于同一帮派。
第二组,共有3种形式(X,Y表示不同的帮派)
1.XXXX型 4种
2.XXYY型 前两只和后两只分别同派,12种
3.XYYX型 中间两只和头尾两只分别同派,12种
其中XYYX的模拟为:
空->X->XY->XYY==X->XX==空
第三组,5不能整除8,显然无解

我们怎么做呢?
观察状态,可以搞出一个dp状态
f[i][j]表示这时有i个数,还要添加j个才可以全出站;
比如L=3;
1122=f[4][2]//需要一个1和一个2才可以
1=f[1][2]//需要2个1
1223332=f[7][2]//需要2个1
111=f[3][0]
nan=f[0][0]
我们考虑地推转移;
如果在后面加一个和当前状态一样的数,那么j会减1;
如果再加一个和当前不一样的数,那么j会加L-1;

if(j+L-1<=1000)                    if(j)f[i+1][j+L-1]=(f[i+1][j+L-1]+f[i][j]*3)%mo;                    else f[i+1][j+L-1]=(f[i+1][j+L-1]+f[i][j]*4)%mo;                if(j)f[i+1][j-1]=(f[i+1][j-1]+f[i][j])%mo;  

当然离线算更稳健

原创粉丝点击