dp專題 猴子與香蕉

2021-08-13 22:52:25 字數 1933 閱讀 2063

猴子與香蕉

題目描述

一組研究人員正在設計乙個測試猴子iq的實驗。他們把香蕉吊在屋頂上,同時給猴子提供了磚塊。如果猴子夠聰明,它會把磚塊乙個個疊起來做成乙個塔,然後爬上去拿到自己喜愛的食物。

研究人員有n種不同的磚塊,而且每種磚塊都是取之不盡的。每種磚塊都是長方體,第i種磚塊的大小是(xi,yi,zi)。磚塊能夠翻轉,可以將任意兩邊當作底面,剩下的那邊作為高。

他們想確定用磚塊搭成的最高塔,能否幫助猴子夠著屋頂。問題是,在疊塔過程中,要放的那塊磚,其底面兩條邊都要小於下面那塊磚的兩條邊,這是為了留個空間給猴子踩腳。

例如,底面相同尺寸的磚塊不能相疊。

現給定磚塊,請計算猴子能夠疊塔的最大高度。

輸入輸入包含多組測試資料。每組輸入的第一行是乙個整數n,表示磚塊的種類數。n的最大值是30。

接著n行,每行輸入三個整數xi,yi和zi。

當n=0時,輸入結束。

輸出對於每組輸入,輸出一行:測試例編號case(從1開始編號),塔能夠達到的最大高度height。

輸出格式為:「case case: maximum height = height」。

樣例輸入

1 10 20 30

2 6 8 10

5 5 5

7 1 1 1

2 2 2

3 3 3

4 4 4

5 5 5

6 6 6

7 7 7

5 31 41 59

26 53 58

97 93 23

84 62 64

33 83 27

0 樣例輸出

case 1: maximum height = 40

case 2: maximum height = 21

case 3: maximum height = 28

case 4: maximum height = 342

題解:

剛開始做的時候是用揹包的思路做的,想了很久,有很多問題,比如揹包的容量是不知道的,還有當遇到二個磚塊,他們都滿足條件,但是乙個長當面有優勢,乙個寬方面有優勢,就不知道怎麼選擇了,最後是用最長下降子串行的方法寫的,然後對dp又有了一點思考,dp的每一步都是乙個高階性的,他的每一步都是自身的也是全域性的,也就是說,這一步一定是正確的,不存在其他可能把他替換掉(對於這題),從而達到所有的最優;

#include

#include

#include

#include

using

namespace

std;

int t;

int fx[95];

int fy[95];

int fv[95];

int a[3];

int f[95];

struct name

bb[95];

bool cmp(name a,name b)

return a.l>b.l;

}int main()

sort(a,a+3);

bb[ans].l=a[2],bb[ans].v=a[1],bb[ans].h=a[0],f[ans]=a[0],ans++;

bb[ans].l=a[1],bb[ans].v=a[0],bb[ans].h=a[2],f[ans]=a[1],ans++;

bb[ans].l=a[2],bb[ans].v=a[0],bb[ans].h=a[1],f[ans]=a[2],ans++;

}sort(bb,bb+ans,cmp);

for(int i=0;ifor(int j=0;jif(bb[i].lint big=0;

for(int i=0;icout

<<"case "

<": maximum height = "

0;}

1134 猴子與香蕉 dp

一組研究人員正在設計乙個測試猴子iq的實驗。他們把香蕉吊在屋頂上,同時給猴子提供了磚塊。如果猴子夠聰明,它會把磚塊乙個個疊起來做成乙個塔,然後爬上去拿到自己喜愛的食物。研究人員有n種不同的磚塊,而且每種磚塊都是取之不盡的。每種磚塊都是長方體,第i種磚塊的大小是 xi,yi,zi 磚塊能夠翻轉,可以將...

猴子與香蕉

題目描述 一組研究人員正在設計乙個測試猴子iq的實驗。他們把香蕉吊在屋頂上,同時給猴子提供了磚塊。如果猴子夠聰明,它會把磚塊乙個個疊起來做成乙個塔,然後爬上去拿到自己喜愛的食物。研究人員有n種不同的磚塊,而且每種磚塊都是取之不盡的。每種磚塊都是長方體,第i種磚塊的大小是 xi,yi,zi 磚塊能夠翻...

猴子摘香蕉

房內有乙個猴子,乙個箱子,天花板掛了一串香蕉,其位置如圖所示。猴子為了拿到香蕉,它必須把箱子搬到香蕉下面,然後再爬到箱子上。請定義必要的謂詞,列出問題的初始化狀態 即下圖所示狀態 目標狀態 猴子拿到了香蕉,站在箱子上,箱子位於位置b 1 定義描述環境狀態的謂詞 at x,y x在y處 x y hol...