【題目描述】
一組研究人員正在設計乙個測試猴子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
【分析】
不難看出,說是有無限的磚塊,實際上最多只能用1種。
又因為磚塊要按遞增順序排列,所以將所有磚塊排序,然後就是求lis了。
注意,磚塊可以任意旋轉,所以乙個磚塊相當於六個。
#include
#include
#include
#include
#include
#include
using
namespace
std;
struct tile re[1001];
int f[1001];
bool cmp(tile a,tile b)
return a.l>b.l;
}int main()
sort(re+1,re+cas+1,cmp);
for (int i=1;i<=cas;i++)
return
0;}
1134 猴子與香蕉 dp
一組研究人員正在設計乙個測試猴子iq的實驗。他們把香蕉吊在屋頂上,同時給猴子提供了磚塊。如果猴子夠聰明,它會把磚塊乙個個疊起來做成乙個塔,然後爬上去拿到自己喜愛的食物。研究人員有n種不同的磚塊,而且每種磚塊都是取之不盡的。每種磚塊都是長方體,第i種磚塊的大小是 xi,yi,zi 磚塊能夠翻轉,可以將...
dp專題 猴子與香蕉
猴子與香蕉 題目描述 一組研究人員正在設計乙個測試猴子iq的實驗。他們把香蕉吊在屋頂上,同時給猴子提供了磚塊。如果猴子夠聰明,它會把磚塊乙個個疊起來做成乙個塔,然後爬上去拿到自己喜愛的食物。研究人員有n種不同的磚塊,而且每種磚塊都是取之不盡的。每種磚塊都是長方體,第i種磚塊的大小是 xi,yi,zi...
猴子摘香蕉
房內有乙個猴子,乙個箱子,天花板掛了一串香蕉,其位置如圖所示。猴子為了拿到香蕉,它必須把箱子搬到香蕉下面,然後再爬到箱子上。請定義必要的謂詞,列出問題的初始化狀態 即下圖所示狀態 目標狀態 猴子拿到了香蕉,站在箱子上,箱子位於位置b 1 定義描述環境狀態的謂詞 at x,y x在y處 x y hol...