正文前先说一点废话。
自去年联赛开始已经一年没有带着学术心理碰电脑了tt
关于这道题我也是今天看到以前的博客的时候才想起来做过了tt
重新又做了一遍理解很深刻了吧quq
希望可以把状压cp掌握地更好一些quq
然后po决定要转c!!!(因为c是面向对象的而popo没有对象)
最后一篇p的博文 希望喜欢。
——————————我是正文与废话的分割线——————
先放个题目链接。
Mondriaan's Dream
众所周知,这是一道状压dp的题。
f[i][sta]表示前i行铺满后,第i+1行状态为sta的方案数。
直接放代码了哦。(づ ̄3 ̄)づ╭❤~
var change:array[-1..1000005,1..2]of longint; f:array[-1..15,0..5005]of int64; m,i,j,n,num:longint; procedure make(t,from,too:longint); begin if t=m then begin inc(num); change[num,1]:=from; change[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 readln(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,change[j,2]]:=f[i,change[j,2]]+f[i-1,change[j,1]]; writeln(f[n,0]); readln(n,m); end; end.