250p CubeStickers
給出若干個方形木板,每個木板有一種顏色。現在要選出其中6個,圍出一個立方體。問是否可能使轉出的立方體,任意兩個相鄰的面顏色不同。
直接按木板的總數分情況討論就可以,但是我漏想了一種情況@.@
其實顯然,同一種顏色最多能用兩次,所以統計每種木板能用的個數之和,sigma(min(count[i],2)),和不小于6則可行。
500p CubePacking給出Ns個邊長為1的立方體和Nb個邊長為L(2<=L<=10)的立方體。要找一個體積最小的長方體,使得可以把所有立方體堆進去。保證結果不超int32。
正是因為不超int32,所以可以直接枚舉兩條棱x,y,算第3條z的最小值。枚舉時循環條件 x*x*x <= INF, x*y*y <= INF。計算z的最小值時要注意除法要向上取整,而且判斷能否把邊長為L的立方體都放進去的條件是(x/L)*(y/L)*(z/L) >= Nb,如果z小了,要加到足夠大為止。
[枚舉]
900p CubeBuilding大小相同的紅、綠、藍色的立方體,分別給R、G、B個(R,G,B<=25)。把這些立方體全部搭積木一樣的堆到N*N(N<=25)的格子棋盤中。可以在任意格子中堆任意高的立方體。規定一種方案是合法的,如果從北向南看的側視圖中只有一種顏色。問一共有多少種堆砌的方案。
可以先考慮N*1的棋盤,也就是側視圖中棋盤寬度是1。先考慮沒有顏色的方塊怎么放,再去染色。這樣不管怎么堆,
看到的方塊數總是等于所有格子堆的最大高度,則需要固定顏色的方塊數就為這個高度,剩下的方塊可以任意染色。同理N*N的棋盤,需要固定顏色的方塊數等于所有列中需要固定的數量之和。要求的答案就是,先枚舉固定方塊的數目,把它們染某一種顏色,剩下的方塊可以用組合數直接算出有多少種染色方案,乘起來,最后求和。
關鍵就是要求出每一種固定方塊數目的前提下,不考慮顏色,有多少種堆放方法。
由前面的討論知道,可以先在N*1的棋盤上按行擴展,需要記錄的狀態是當前已使用的方塊數,當前的最大高度。
然后利用這個結果按列擴展,記錄的狀態是當前已使用的方塊數,當前已固定的方塊數。
ps.染色之前的方案數只用求一次,之后分別把固定的方塊染成3種不同顏色,只要用組合數分別算3次,加起來就行了。
O(9*N^5)的算法,時限有點緊。
[DP]
posted on 2011-06-01 00:04
wolf5x 閱讀(252)
評論(0) 編輯 收藏 引用 所屬分類:
topcoder