问题 A: 铺砖块
时间限制: 1 Sec 内存限制: 128 MB提交: - 解决: -
[ 提交][ 讨论版]
题目描述
现有n*m的一块地板,需要用1*2的砖块去铺满,中间不能留有空隙。问这样方案有多少种
输入
输入n,m(1<=n, m<=11)
有多组输入数据,以m=n=0结束
输出
输出铺砖块的方案数
样例输入
样例输出
10123514451205
状压DP
f[i][sta]表示前i行铺满后,第i+1行状态为sta的方案数。
var
line:array[-1..1000000,1..2]of longint;
f:array[-1..12,0..5000]of int64;
m,i,j,n,num:longint;
procedure make(t,from,too:longint);
begin
if t=m then
begin
inc(num);
line[num,1]:=from;
line[num,2]:=too;
exit;
end;
if t>m then exit;
make(t+1,from<<1+1,too<<1);
make(t+1,from<<1,too<<1+1);
make(t+2,from<<2,too<<2);
end;
begin
read(n,m);
while (n<>0)and(m<>0) do
begin
num:=0;
make(0,0,0);
fillchar(f,sizeof(f),0);
f[0,0]:=1;
for i:=1 to n do
for j:=1 to num do
f[i,line[j,2]]:=f[i,line[j,2]]+f[i-1,line[j,1]];
writeln(f[n,0]);
read(n,m);
end;
end.