應對題目:用1*2的骨牌鋪滿n*m的矩形總共有多種方法
方法1:狀壓dp:
複雜度:n*m*(2^m)
解題過程:
1、為了提高效率,我們規定m=m就交換
2、以單個格仔作為每個階段,遞推方向為從左上到右下,每個階段儲存前m個方塊的狀態,1表示已覆蓋,0表示未覆蓋
3、階段決策是:"以當前格仔為右下角,要不要放骨牌以及放哪種骨牌",答案有3種:不放骨牌、放豎骨牌、放橫骨牌,其中①不放骨牌要求上面的格仔必須被覆蓋,即k&(1<<(m-1))==1②放豎骨牌要求上面的格仔必須沒有被覆蓋且且不能是第一行,即i!=1 && (k&(1<<(m-1)))==0③放橫骨牌要求上面的格仔必須被覆蓋且左邊的格仔必須沒有被覆蓋還不能是第一列,即j!=1 && (k&(1<<(m-1)))!=0 && (k&1)==0
缺點:複雜度略高
#include#include#includeusing namespace std;
int n, m, cur;
long long dp[2][1<<15]; /*1表示當前位置已被填上,0則相反*/
int main(void)
printf("%.0f\n", sum);
} return 0;
}
方法3:矩陣快速冪:
詳見
骨牌鋪方格
time limit 1 sec memory limit 128 mb submit 43 solved 12 submit status web board 在2 n的乙個長方形方格中,用乙個1 2的骨牌鋪滿方格,輸入n 輸出鋪放方案的總數.例如n 3時,為2 3方格,骨牌的鋪放方案有三種,如下...
骨牌鋪方格
problem description 在2 n的乙個長方形方格中,用乙個1 2的骨牌鋪滿方格,輸入n 輸出鋪放方案的總數.例如n 3時,為2 3方格,骨牌的鋪放方案有三種,如下圖 input 輸入資料由多行組成,每行包含乙個整數n,表示該測試例項的長方形方格的規格是2 n 0 n 50 outpu...
骨牌鋪方格
problem description 在2 n的乙個長方形方格中,用乙個1 2的骨牌鋪滿方格,輸入n 輸出鋪放方案的總數.例如n 3時,為2 3方格,骨牌的鋪放方案有三種,如下圖 輸入資料由多行組成,每行包含乙個整數n,表示該測試例項的長方形方格的規格是2 n 0 n 50 output 對於每個...