HDU1069 猴子疊木塊

2021-08-07 23:27:04 字數 1377 閱讀 7841

題目:

研究人員有n種型別的塊,並且每種型別的塊都是無限制的。 每個i型塊是具有線性尺寸(xi,yi,zi)的矩形固體。 塊可以重新定向,使得它的三個維度中的任何兩個確定基座的尺寸,而另乙個尺寸是高度。

他們想要確保通過堆放塊可能的最高的塔可以到達屋頂。 問題在於,在建造塔架時,只能將一塊塊放置在另一塊的頂部,只要上塊的兩個基座尺寸都嚴格小於下塊的相應底座尺寸,因為必須 一些空間讓猴子踩上。 這意味著,例如,面向具有相等尺寸的基座的塊不能被堆疊。

你的工作就是編寫乙個程式,用來確定猴子能用一組給定的塊建立的最高塔的高度。

sample input

1

10 20 30

26 8 10

5 5 5

71 1 1

2 2 2

3 3 3

4 4 4

5 5 5

6 6 6

7 7 7

531 41 59

26 53 58

97 93 23

84 62 64

33 83 270

sample output

case 1: maximum height = 40

case 2: maximum height = 21

case 3: maximum height = 28

case 4: maximum height = 342

思路:這道題給出一些木塊的尺寸,每種木塊無限個,求出能堆最大高度。

首先,每個木塊可以有3!6種擺法,每種擺法構成1種模型。每種模型最多用一次,因為長寬要越來越小。

而且要先用大的。所以可以以長a從大到小排序。dp[i]表示前i種模型能堆的最大高度,並且第i種在最上面。

dp[i]=max(dp[j]+a[i]),j

#include#include#include#includeusing namespace std;

struct tans

;tans block[300];

int dp[300];

int len;//儲存模型數量

void input(int a,int b,int h)

bool cmp(tans m, tans n)//按照長度從大到小

int main()

sort(block + 1, block + 1 + len, cmp);

dp[1] = block[1].h;

for (i = 2; i <= len; i++)

{dp[i] = block[i].h;//至少為第i個本身的高度

for (j = i-1; j >= 1; j--)

{if(block[i].a

hdu1069 記憶化搜尋

此題思路還是比較清晰的,對於每個x,y,z,都會有三種情況,dp i 表示把第i個放在最下面得到的最大高度,狀態轉移方程為dp i max dp i dp j height 這裡的j要滿足能夠放在i上面,height為第i個矩形的高度 如下 include include include inclu...

hdu 1069 記憶化搜尋 dp

題目鏈結 題意 有n種長方體,每個都有無數個,分別告訴你它們的長寬高,問最多能疊多高,要求是上面的長方體的地面積的長和寬都要比下面的長方體的小,長方體可以旋轉,就是說放的時候可以以任意一面作為底面積。思路 用a i j 來記錄第i種長方體的第j條邊的高,用dp i j 表示以第i個長方體為底且以第j...

HDU 1069 基礎動態規劃 排序

題意 給出n種立方體石頭 當且僅當一塊石頭的底部寬度長度都小於一塊石頭的時候才能放在上面 問最高能放多高?石頭不限數目 然而同樣一種石頭採用同樣的擺放方式 兩快相同石頭一定無法進行放置 所以 一塊石頭的一種擺放方式最多使用一次 進行一下排序 讓長與寬最小的放在最前面 然後就是可愛的dp模板了 inc...