鋪地磚 狀壓DP練習

2022-03-30 07:06:22 字數 1220 閱讀 7803

有乙個n*m(n<=5,m<=1000)的棋盤,現在有1*2及2*1的小木塊無數個,要蓋滿整個棋盤,有多少種方式?答案只需要mod1,000,000,007即可。

//我也不知道這道題的**qaq

n和m的範圍本應是相同的,但是題目給出的n的值很小,這就給我們提供了使用狀壓dp的思路。

假設第一列已經鋪滿,則第二列的情況只與第一列對它的影響有關,同理,第三列的情況也只與第二列對它的影響有關,我們可以利用二進位制來表示某一列的情況,狀態state表示某一列的狀態,例如state=4,則此列狀態為00100,用dp[i][state]表示第i列,第i-1列對它的影響為state的方案數,求每一列的方案數可以通過搜尋來實現,dp[i][state]=sigma(dp[i-1][la]) la可以通過填放變為state。

**:

1

//鋪棋盤2//

2015/10/22

3 #include4 #include5 #include6 #include7 #include8 #include9 #include10

#define maxn 100000000+50

11#define inf 0x7fffffff

12#define xiao 1e-9

13#define mod 1000000007

14using

namespace

std;

15int dp[1005][40

],n,m;

16void dfs(int i,int j,int state,int

next)

17//

如果列舉到了最後一行,則下一列狀態為next時方案數加上此列狀態為state的方案數

24if(((1

<0) dfs(i,j+1,state,next);//

如果第j行位置已被占用,直接跳過,搜尋j+1行

25if(((1

<0) dfs(i,j+1,state,next|(1

如果未被占用,嘗試填放乙個1*2的

26if(j+1

1<0&&((1

<<(j+1)&state)==0)) dfs(i,j+2,state,next);//

如果此位置以及下一位置都未被占用,嘗試放乙個2*1的

27return;28

}29intmain()

3039 cout<1][0]<40return0;

41 }

C語言鋪地磚問題

鋪地磚 time limit 1000ms memory limit 65536k total submit 711 accepted 224 description 元旦過去了,新年大酬賓活動也已經告一段落了。陳蓋歷望著堆在倉庫的瓷磚,很無聊的他把這些瓷磚裁成很多1x1 1x2 1x3的小瓷磚,然...

矩陣覆蓋 鋪地磚問題

描述 我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?思路 target 1大矩形為2 1,只有一種擺放方法,return1 target 2 大矩形為2 2,有兩種擺放方法,return2 target n 分為兩步考...

鋪地磚(找遞推式 大數)

時間限制 1 sec 記憶體限制 128 mb 題目描述 一天,晨晨的數學老師布置了一道題目,大意如下 用1 1和2 2的磁磚不重疊地鋪滿n 3的地板,共有多少種方案?例如 n 1時 1 3的地板方法就乙個,直接由三個1 1的磁磚鋪滿。n 2時 2 3的地板可以由下面3種方案鋪滿 輸入第一行 乙個整...