jzoj2938分割田地

题意:要求把2*n的方格分成k个连通区域,每个区域至少有一个格子。问你方案数模100000007之后是多少。
题解:一个比较神奇的dp,设 f[i,j,0/1] ,表示当前做到第i行,分成k个连通区域,第i行的两个格子属于/不属于同一个连通区域,
然后要分类讨论一下:
首先是 f[i,j,0] 的转移:
有如下几种情况:
这里写图片描述
f[i1,j1,1] 转移过来
这里写图片描述
f[i1,j1,1] 转移过来。
这里写图片描述
f[i1,j2,1] 转移过来。
这里写图片描述
f[i1,j,0] 转移过来。
这里写图片描述
f[i1,j1,0] 转移过来。
这里写图片描述
f[i1,k1,0] 转移过来。
这里写图片描述
f[i1,j2,0] 转移过来。
所以
f[i,j,0]:=(f[i1,j1,1]2+f[i1,j2,1]+f[i1,j,0]+f[i1,j1,0]2+f[i1,j2,0])
然后 f[i,j,1] 的转移类似,自己想一想吧。

贴上代码

const
        maxn=1005;
        mo=100000007;
var
        f:array[0..maxn,-1..2*maxn,0..1] of int64;
        i,j,n,k:longint;
begin
        readln(n,k);
        f[1,1,1]:=1;
        f[1,2,0]:=1;
        for i:=2 to n do
        begin
                for j:=1 to k do
                begin
                        f[i,j,0]:=(f[i-1,j-1,1]*2+f[i-1,j-2,1]+f[i-1,j,0]+f[i-1,j-1,0]*2+f[i-1,j-2,0]) mod mo;
                        f[i,j,1]:=(f[i-1,j,0]*2+f[i-1,j,1]+f[i-1,j-1,1]+f[i-1,j-1,0]) mod mo;
                end;
        end;
        writeln((f[n,k,0]+f[n,k,1]) mod mo);
        write(#26);//注明:jzoj上数据有问题,要加这个,若不在jzoj上提交,可去掉此语句。
end.

the end

由于我的水平有限,难免会有些写错的地方,希望大家批评指正,多多包容,thank you for your patience.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值