演算法:遞推+數學綜合
題目大意:有t資料,給定乙個2*n的矩陣,只能利用1*2和2*2的骨牌,讓你去組成2*n的矩陣,問有多少種組成方法。
分析:從題目大意上不難看出,本題是一道遞推題目,由前面的組成方案可以推得後面的組成方案,具體推法如下:
1:當前的2*n的矩陣可以拆分成2*(n-1)+1*2的或者是2*(n-2)+2*2的,所以組成2*i的矩形可以由以上兩種方式組成,注意有重複。
2:如果讀入的n是奇數,那麼我們就少算了一種乙個1*2的矩形在正**,其它部分位於它左右的一種情況,這種情況下少算了乙個矩形。
如果讀入的n是偶數,那麼就少算了兩種情況,乙個是把當前矩形平均分成兩半的,這樣的矩形由於之前已經算過乙個了,所以只加上乙個;還有一種情況就是當前矩形在減去乙個1*2的矩形之後剩下的奇數長的矩形,而這樣的組成方案又要按著剛才的演算法計算。
3:最後注意之前算的都是在沒考慮對稱的情況下的結果,因此我們還要把結果除以2。
program d;
const
maxn=30;
var f:array [0..maxn] of int64;
t,n:longint;
procedure main;
var i,j:longint;
begin
f[0]:=1;
f[1]:=1;
readln(t);
for i:=1 to t do
begin
readln(n);
for j:=2 to n do f[j]:=f[j-1]+2*f[j-2];
if odd(n) then writeln((f[n]+f[(n-1) div 2]) div 2) else writeln((f[n]+2*f[(n div 2)-1]+f[n div 2]) div 2);
end;
end;
begin
assign(input,'d.in'); reset(input);
assign(output,'d.out'); rewrite(output);
main;
close(input); close(output);
end.
小矩形塊組成大矩形塊
我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?先下結論,還是斐波那契 如同,如果第乙個方塊是縱向放置,則剩餘的是f n 1 種,如果第一次放置時橫向放置,則第二塊位置只能橫向放置,因此剩餘f n 2 種 因此 f n ...
骨牌平鋪問題
有乙個n m的棋盤,現在用1 2的骨牌去覆蓋,問有多少種不同方法可以將這個棋盤全部覆蓋。1 狀態壓縮dp 列舉相鄰兩行的狀態進行匹配轉移 複雜度o n 2 m 2 poj 2663 include poj 2663.cpp include include include include includ...
骨牌覆蓋問題
骨牌覆蓋問題,就是用 1x2 大小的骨牌,鋪設乙個給定大小的乙個矩形區域,要求必須鋪滿,且不可以超出邊界。問總的鋪設方案數字多少?這一類問題就是骨牌覆蓋問題。不同規模的資料有不同的方法。下面來看看最簡單的 2 n 區域裡面的鋪設方法數。n 0,一種 n 1 為一種 n 2,兩種 n 3,5種 較為容...