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

2021-08-08 18:45:16 字數 963 閱讀 2463

思路:

這類題主要的難點就在於狀態的轉移,可以先看看這道題(骨牌覆蓋問題·三)中的提示

dp[i][j]表示從狀態i轉換成狀態j共有多少種方法(二進位制下的01表示骨牌是否覆蓋)

則m行的排法就是dp^(m+1)的值(第0行的狀態為0,第m行的狀態為((1<<n)-1,則需進行m+1次dp=dp*dp)

因此,我們可以先用dfs處理出狀態轉移的可行性,然後矩陣快速冪即可

**:

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int maxn=1

<<5;

const ll mod=1e9+7;

int n,m,n,dp[maxn][maxn];

struct matrix

res,arr;

void dfs(int col,int pre,int now)

dfs(col+1,pre<<1,now<<1|1);//豎放,第col+1列由空變為放骨牌

dfs(col+1,pre<<1|1,now<<1);//不放,第col+1列由放骨牌變為空

if(col+2

<=n)//橫放,col+1和col+2列均放骨牌

dfs(col+2,pre<<2|3,now<<2|3);

}matrix mul(matrix a,matrix b)

ll pow_matrix(matrix a)

return arr.mat[0][n-1];

}int main()

lastone

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 矩陣快速冪 對於每行最多只有5列,因此可以列舉出它們的全部狀態 0 1 1.由於是1x2的骨牌,則二進位制數11,110是合法的,1,10是不合法的,那麼其合法的狀態只有d 2.對於第i行的狀態只與第i 1行的狀態有關,那麼對於第i 1行的狀態a中二進位制位為0的就必須要在第i行...