dp專題 狀態壓縮dp 51nod 1033

2022-05-04 10:12:09 字數 1539 閱讀 1191

在m*n

的乙個長方形方格中,用乙個

1*2的骨牌排滿方格。問有多少種不同的排列方法。(

n <= 5)

例如:3 * 2

的方格,共有

3種不同的排法。(由於方案的數量巨大,只輸出

mod 10^9 + 7

的結果)

input

2個數m n

,中間用空格分隔(

2 <= m <= 10^9

,2 <= n <= 5

output

輸出數量

mod 10^9 + 7

input

示例2 3

output

示例3

對於n為5的情況:結合**看下圖, dp[i][j]表示的意義是在連續的k長的一段中,首部狀態是i,尾部狀態是j的組成的圖形中,一共有多少種鋪磚方法,這裡的k實際上就是dp=dp*dp運算了k次,可以結合矩陣和圖的聯絡去理解。

在函式dfs中完成對dp的初始化,此時k實際上是1,然後計算出dp^(m+1)的值就行了。

#include #include 

#include

#include

using

namespace

std;

typedef

long

long

ll;

const

int mod=1e9+7

; ll dp[

1<<5][1

<<5

]; int

m,n;

void dfs(int col,int pre,int

now) //

在這裡沒有做好!為什麼這裡只用三個dfs,是因為如果加上後兩個就會有重複了。

//認真考慮一下還是可以相對的

dfs(col+1,pre<<1,(now<<1)|1

); dfs(col+1,(pre<<1)|1,now<<1

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

); //

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

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

} void mul(ll ret[1

<<5][1

<<5],ll a[1

<<5][1

<<5],ll b[1

<<5][1

<<5

])

ret[i][j]=tmp;

} }

intmain()

m=m>>1

; mul(tmp,dp,dp);

for(int i=0; i

for(int j=0; j

} cout

<0][(1

<1]<

}

POJ 狀態壓縮DP專題

poj3254 狀態壓縮dp的入門題。純粹的二維遞推,還可以通過滾動陣列優化,但這裡並不需要。include include include using namespace std int m,n,f 13 1 12 intmap 13 int in bool check int j,int k i...

狀態壓縮DP

首先,我們以一道狀壓經典題tsp來引入。tsp問題 一張圖上有n個點,給定相應的鄰接矩陣,需要求出從0號節點出發,經過且只經過每個頂點一次,最後仍回到0號節點的最小邊權。思路 假設現在已訪問過的頂點集合 起點0當作還未訪問過的頂點 為s,當前所在頂點為v,用dp s v 表示從v出發訪問剩餘的所有頂...

狀態壓縮DP

theme 給定乙個n m的玉公尺田,1 n,m 12。值為0表示不能在該塊種草,為1表示可以。現在要在其上中若干草地,要求任意草地間不相鄰 沒有公共邊 問不考慮草地個數的情況下,有多少種種植的方案?solution 用dp。又範圍很小,所以考慮狀態壓縮dp,另dp i j 表示從前i行種植,最後一...