一組研究人員正在設計乙個測試猴子iq的實驗。他們把香蕉吊在屋頂上,同時給猴子提供了磚塊。如果猴子夠聰明,它會把磚塊乙個個疊起來做成乙個塔,然後爬上去拿到自己喜愛的食物。
研究人員有n種不同的磚塊,而且每種磚塊都是取之不盡的。每種磚塊都是長方體,第i種磚塊的大小是(xi,yi,zi)。磚塊能夠翻轉,可以將任意兩邊當作底面,剩下的那邊作為高。
他們想確定用磚塊搭成的最高塔,能否幫助猴子夠著屋頂。問題是,在疊塔過程中,要放的那塊磚,其底面兩條邊都要小於下面那塊磚的兩條邊,這是為了留個空間給猴子踩腳。
例如,底面相同尺寸的磚塊不能相疊。
現給定磚塊,請計算猴子能夠疊塔的最大高度。
輸入包含多組測試資料。每組輸入的第一行是乙個整數n,表示磚塊的種類數。n的最大值是30。
接著n行,每行輸入三個整數xi,yi和zi。
當n=0時,輸入結束。
對於每組輸入,輸出一行:測試例編號case(從1開始編號),塔能夠達到的最大高度height。
輸出格式為:「case case: maximum height = height」。
110 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 27
0case 1: maximum height = 40
case 2: maximum height = 21
case 3: maximum height = 28
case 4: maximum height = 342
每個箱子最多出現三次,按不同的高設定三個箱子,再dp即可
#pragma warning(disable:4996)
#include #include#include#include#include#includeusing namespace std;
int m[100][100];
int t, n;
struct typea[100];
int c[3];
int ok(int i, int j)
else return 0;
}int d[100];
int dp(int i)
int main()
a[num].h = a[num].l = a[num].w= 0;//設定終點,長寬高均為0,方便計算長度。
n=num+1;
int max_len = 1;
for (int i = 0; imax_len) max_len = d[i];//dp找最大值
//case 1: maximum height = 40
printf("case %d:maximum height = %d\n", cas++, max_len);
} //while (1);
return 0;
}
dp專題 猴子與香蕉
猴子與香蕉 題目描述 一組研究人員正在設計乙個測試猴子iq的實驗。他們把香蕉吊在屋頂上,同時給猴子提供了磚塊。如果猴子夠聰明,它會把磚塊乙個個疊起來做成乙個塔,然後爬上去拿到自己喜愛的食物。研究人員有n種不同的磚塊,而且每種磚塊都是取之不盡的。每種磚塊都是長方體,第i種磚塊的大小是 xi,yi,zi...
猴子與香蕉
題目描述 一組研究人員正在設計乙個測試猴子iq的實驗。他們把香蕉吊在屋頂上,同時給猴子提供了磚塊。如果猴子夠聰明,它會把磚塊乙個個疊起來做成乙個塔,然後爬上去拿到自己喜愛的食物。研究人員有n種不同的磚塊,而且每種磚塊都是取之不盡的。每種磚塊都是長方體,第i種磚塊的大小是 xi,yi,zi 磚塊能夠翻...
猴子摘香蕉
房內有乙個猴子,乙個箱子,天花板掛了一串香蕉,其位置如圖所示。猴子為了拿到香蕉,它必須把箱子搬到香蕉下面,然後再爬到箱子上。請定義必要的謂詞,列出問題的初始化狀態 即下圖所示狀態 目標狀態 猴子拿到了香蕉,站在箱子上,箱子位於位置b 1 定義描述環境狀態的謂詞 at x,y x在y處 x y hol...