思路:
這類題主要的難點就在於狀態的轉移,可以先看看這道題(骨牌覆蓋問題·三)中的提示
dp[i][j]表示從狀態i轉換成狀態j共有多少種方法(二進位制下的01表示骨牌是否覆蓋)
則m行的排法就是dp^(m+1)的值(第0行的狀態為0,第m行的狀態為((1<<n)-1,則需進行m+1次dp=dp*dp)
因此,我們可以先用dfs處理出狀態轉移的可行性,然後矩陣快速冪即可
**:
lastone#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()
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行...