狀壓dp之棋盤覆蓋

2021-07-29 14:01:08 字數 2301 閱讀 8982

1.poj2411

題目大意:用2*1的骨牌覆蓋滿乙個n*m的矩陣,求方案數。(n,m<=11)

題目分析:由於n和m都很小,可以想到狀態壓縮dp。如果我們f[i][j]表示某i行的狀態j,在狀態j中,1表示已經覆蓋,0表示沒有覆蓋,那麼有三種情況:1.不放 2.橫著放 3.豎著放。用dfs來尋找每行和它上行之間可以轉換的狀態,上行狀態是s1,這行狀態是s2,l是列號,那麼dfs的擴充套件方式如下:

1.l=l+1,s1=(s1<<1)+1,s2=(s2<<1)//因為如果這一行的這乙個地方不放骨牌,那麼上一行如果空著,就不符合放滿骨牌的規則了。

2.l=l+2,s1=(s1<<2)+3,s2=(s2<<3)+3.

3.l=l+1,s1=(s1<<1),s2=(s2<<1)+1//因為如果這一行要豎著放,那麼上一行此處必須空著

初始條件:f[0][1...111]=1//第一行不能豎著放

**

#include#include#include#include#include#include#include#include#includeusing namespace std;

const int inf=(1<<11);

int n,m,maxn,sum=0;//sum:對應關係的數量

int gx1[1000001],gx2[1000001];

long long f[12][inf];

void dfs(int l,int now,int last)

dfs(l+1,(now<<1),(last<<1)+1);//不放

dfs(l+1,(now<<1)+1,(last<<1));//放豎著

dfs(l+2,(now<<2)+3,(last<<2)+3);//放橫著

}int main()

if(n>m)

maxn=(1<2.sgu131

題目大意:用2×1的骨牌或者2×2挖去一塊的「l」形骨牌覆蓋整個棋盤,求方案數

如果這一行要放豎著的骨牌,那麼上一行此處不能放骨牌。如果上一行此處沒有影響,就必須要放了骨牌才能覆蓋滿。

編號狀態

條件轉移s1,s2

轉移b1,b2

10 0

0 0無

s1=(s1<<1)+1-b1

s2=(s2<<1)+b2

b1=0

b2=0

20 0

1 1b2=0

s1=(s1<<1)+1-b1

s2=(s2<<1)

b1=0

b2=1

31 0

1 0b1=0

b2=0

s1=(s1<<1)

s2=(s2<<1)+1

b1=0

b2=0

41 0

1 1b1=0

b2=0

s1=(s1<<1)

s2=(s2<<1)+1

b1=0

b2=1

51 1

0 1b1=0

s1=(s1<<1)

s2=(s2<<1)+b2

b1=1

b2=1

61 1

1 0b1=0

b2=0

s1=(s1<<1)

s2=(s2<<1)+1

b1=1

b2=0

70 1

1 1b2=0

s1=(s1<<1)+1-b1

s2=(s2<<1)+1

b1=1

b2=1

**

#include#include#include#include#include#include#include#include#includeusing namespace std;

const int inf=(1<<9);

long long f[10][inf];

int n,m,x;

void search(int l,int s1,int s2,int b1,int b2)

return;}

search(l+1,(s1<<1)+1-b1,(s2<<1)+b2,0,0);//1

if(b1==0&&b2==0)

if(b1==0)

if(b2==0)

}int main()

{ int i,j,tmp,maxn;

scanf("%d%d",&n,&m);

if(n

LCP 4 覆蓋 狀壓DP

oj 題意已經非常清楚了,這題其實跟 poj 2411 這道題類似,算是乙個加強版,都是放置多公尺諾骨牌,不過這個題新增了障礙物,也就是多加了判斷而已,不過也在放置邏輯上加大了難度。核心思想依然是 列舉上一行的狀態,搜尋這一行所有可能的填寫情況。我們定義如下這種填充表示方式 如果乙個骨牌是橫著放的,...

狀壓dp 棋盤問題的學習

有乙個n m n 5,m 1000 的棋盤,現在有1 2及2 1的小木塊無數個,要蓋滿整個棋盤,有多少種方式?答案只需要mod1,000,000,007即可。我也不知道這道題的 qaq n和m的範圍本應是相同的,但是題目給出的n的值很小,這就給我們提供了使用狀壓dp的思路。假設第一列已經鋪滿,則第二...

棋盤式狀壓DP模型總結

狀壓dp分兩大類,一類是集合式,另一類就是棋盤式 即基於連通性 其中,集合式狀壓dp難度相較後者略大,形式複雜多變。而棋盤式狀壓dp的題目樣式都相差不多,解法也都殊途同歸,因此將這一類題進行總結,不難歸結出一套解題模板。我們先看以下三個例題。題目鏈結 狀態表示 f i,j,s 表示已經在前i行放了j...