猴子與香蕉
題目描述
一組研究人員正在設計乙個測試猴子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...