解题报告 Diamonds
生活随笔
收集整理的這篇文章主要介紹了
解题报告 Diamonds
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 題目 diamonds 題目描述 小keke同學(xué)非常喜歡玩俄羅斯方塊(*^*),他最近發(fā)現(xiàn)傳統(tǒng)的俄羅斯方塊很無(wú)趣,于是他想到了一個(gè)新規(guī)則的游戲來(lái)惡心你(……,沒(méi)素質(zhì)啊)。 游戲是這樣的: 給定你一個(gè)寬度為w的游戲場(chǎng)地,我們?cè)O(shè)高度為正無(wú)窮。現(xiàn)在給你3種俄羅斯方塊: 1*2的方塊 2*2的方塊 2*2的方塊去掉一個(gè)1*1的方塊 如果你明白俄羅斯方塊的規(guī)則的話,方塊在下落過(guò)程中是可以隨便旋轉(zhuǎn)的。而且是從上往下落,上面的落在下面的上面(廢話!!!) 現(xiàn)在給定你一個(gè)高度h,讓你求出有多少種游戲的方法,使得最后恰好落滿h的高度(最上層是齊平的)。因?yàn)檫@樣可以得巨多分!巨!舒服~~~~~ 輸入文件(diamonds.in) 兩個(gè)整數(shù)h,w含義如題所述 輸出文件(diamonds.out) 一個(gè)整數(shù),為能達(dá)到要求的游戲方法的總數(shù)。 數(shù)據(jù)范圍 1<=h,w<=9,注意答案有可能很大(你懂得,用不到高精度) 樣例輸入 2 2 樣例輸出 3 2. 題目實(shí)質(zhì) 用給定的三種磚講一個(gè)區(qū)域鋪滿(又是廢話) 3. 算法 DP+DFS (也就是狀態(tài)壓縮型 DP ) 首先,每一個(gè)狀態(tài)均可以由他前面的某一個(gè)狀態(tài)轉(zhuǎn)移而來(lái),所以,滿足 DP 的無(wú)后效性,用 DP 解決。 方程十分好寫(xiě):f[I,j]:=sigma(f[I-1,k]*g[k,j](其中狀態(tài) k 可以轉(zhuǎn)移到狀態(tài) j ,I 表示該狀態(tài)鋪滿的高度為高度為 I )) 初始值 f[1,0]:=1; 因?yàn)楸绢}中一共三種磚,所以情況會(huì)很多,這也是比較惡心人的地方,因?yàn)榍闆r太多,有多種轉(zhuǎn)移的方法,所以不能用 Boolean 類型數(shù)組直接判斷,而應(yīng)該用一個(gè) g 數(shù)組記錄,然后用乘法原理,將方案數(shù)直接進(jìn)行累加。 狀態(tài)用二進(jìn)制(HASH)存儲(chǔ)。 將矩陣的1行看成一種狀態(tài),則某一行矩陣的鋪磚情況可以用一個(gè)01串表示:0表示未鋪磚,1表示已鋪了磚。 然后,狀態(tài)改變時(shí)用位運(yùn)算改變。 對(duì)于上下兩行:要能用某種類型的磚鋪,必須該磚所覆蓋的區(qū)域?yàn)榭铡?當(dāng)搜出邊界時(shí),直接跳出。(遞歸出口) 4. 注意事項(xiàng) 一定要開(kāi) int64 ! 5. 程序代碼 Leve (pascal) var n,m,i,j,k:longint; f:array[0..9,0..1024] of int64; g:array[0..1024,0..1024] of int64; procedure dfs(step,now:longint); begin if step=m+1 then begin inc(g[i,now]); exit; end; if 1<0 then dfs(step+1,now) //如果這一行不能再鋪了,就搜下一行。 else begin if (1<1) then dfs(step+1,now+1<
轉(zhuǎn)載于:https://www.cnblogs.com/SueMiller/archive/2011/08/10/2133801.html
總結(jié)
以上是生活随笔為你收集整理的解题报告 Diamonds的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: DM、EV两条腿越走越快!比亚迪7月新能
- 下一篇: 训练(线段树+树状数组) poj——32