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...