有乙個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種方案鋪滿 輸入第一行 乙個整...