51nod 1033 骨牌覆蓋 V2

2021-08-28 12:56:55 字數 1041 閱讀 7014

思路:狀態壓縮dp+矩陣快速冪

對於每行最多只有5列,因此可以列舉出它們的全部狀態 0->(1<1.由於是1x2的骨牌,則二進位制數11,110是合法的,1,10是不合法的,那麼其合法的狀態只有d

2.對於第i行的狀態只與第i-1行的狀態有關,那麼對於第i-1行的狀態a中二進位制位為0的就必須要在第i行的狀態b中補上,

例如a=5(101) 那麼b=3(11)是合法的, b=1是不合法的,因為b=1,101和001是不可以將中間的0給補上,而b=3則是將 2*1的骨牌插在中間,因此對於第i行狀態b來說 a|b=(1<3.同時 a&b必須在合法狀態中才行,因為a&b表示第i行的1*2的骨牌的擺放狀態,例如 二進位制 a=1011,b=1110,這時 a&b=1010而此時的骨牌是沒法擺放的

4.那麼此時就可以寫出狀態壓縮dp了

dp[1][0]=dp[1][3]=dp[1][6]=dp[1][12]=dp[1][15]=dp[1][24]=dp[1][27]=dp[1][30]=1;

int s=(1時間複雜度為 o(n*pow(2,5)*pow(2,5))是肯定超時的

而我們對轉移方程觀察發現

dp[i][j]只與 dp[i-1][k]有關,而對於判斷條件if((j|k)==s&&d[j&k]) 也是固定的

那麼就可以用矩陣快速冪來優化.

code  狀態壓縮dp版本:

#include#includeusing namespace std;

const int mod=1e9+7;

const int max_n=1005;

int n,m;

bool d[35];

int dp[max_n][35];

int main()

matrix operator*(const matrix &a)

cout<

return 0;

}

51nod 1033骨牌覆蓋 V2

矩陣乘法題 就是狀壓一下一列的狀態然後預處理出某兩種狀態的轉移的方案數 然後構造乙個矩陣a i j 表示i的狀態到j的狀態的條數 然後直接矩陣乘法就可以了 include include include includeusing namespace std const int mod 1000000...

51nod 1033 骨牌覆蓋 V2

題意 1033 骨牌覆蓋 v2 基準時間限制 1 秒 空間限制 131072 kb 分值 320 難度 7級演算法題 在m n的乙個長方形方格中,用乙個1 2的骨牌排滿方格。問有多少種不同的排列方法。n 5 例如 3 2的方格,共有3種不同的排法。由於方案的數量巨大,只輸出 mod 10 9 7 的...

51nod 1033 骨牌覆蓋 V2(矩陣快速冪)

思路 這類題主要的難點就在於狀態的轉移,可以先看看這道題 骨牌覆蓋問題 三 中的提示 dp i j 表示從狀態i轉換成狀態j共有多少種方法 二進位制下的01表示骨牌是否覆蓋 則m行的排法就是dp m 1 的值 第0行的狀態為0,第m行的狀態為 1 n 1,則需進行m 1次dp dp dp 因此,我們...