HDU 1069 Monkey and Banana
阿新 • • 發佈:2018-12-22
分類
HDU 動態規劃 貪心
題意
題意是堆箱子、要求上面的箱子的長和寬都小於下面箱子的長和寬
想法
因為每塊磚有三種擺法(高和底面積不同),可以把這三種情況當成不同的三塊磚,加入brick陣列中。注意,一定要分清長和寬,長要比寬長,這樣在後面dp的過程中可以保證長邊和長邊比較、短邊和短邊比較。
所以
- 要麼保證長比寬長,每次錄入3個面
- 要麼每次錄入6個面
因為這個卡了好久
程式碼
15ms
/**
* Author: GatesMa
* Email: [email protected]
* Todo: ACM Training
* Date:2018/11/17
*/
#include <bits/stdc++.h>
using namespace std;
int dp[2000];
struct node{
int l, w, h;
}brick[2000];
bool cmp(node a, node b)
{
if(a.l != b.l){
return a.l > b.l;
}else{
return a.w > b.w;
}
}
int main()
{
int n;
int tmp[3], ans, k;
int kase = 0;
while(scanf("%d",&n)!=EOF) {
if(n ==0){
return 0;
}
k = 0;
for(int i =0;i < n;i++){
scanf("%d%d%d",&tmp[0],&tmp[1],&tmp[2]);
sort(tmp,tmp+3);
brick[k].l=tmp[0];
brick[k].w=tmp[1];
brick[k++].h=tmp[2];
brick[k].l=tmp[1];
brick[ k].w=tmp[2];
brick[k++].h=tmp[0];
brick[k].l=tmp[0];
brick[k].w=tmp[2];
brick[k++].h=tmp[1];
}
sort(brick, brick + k, cmp);
ans = -1;
for(int i = 0;i < k;i++){//遍歷所有磚塊
dp[i] = brick[i].h;//dp[i]代表以第i塊磚為頂的塔的最大高度
//初始值是i磚塊的高度(最壞的情況就是塔只有i一塊磚)
for(int j= i-1;j >=0; j--){//開始決定i磚塊底下的磚是什麼
if(brick[j].l > brick[i].l && brick[j].w > brick[i].w){//如果j磚塊符合條件
dp[i] = max(dp[i], dp[j] + brick[i].h);
//放在以j磚塊為頂的塔上是否比原來的值大
}
}
ans = max(ans, dp[i]);//答案是所有dp中的最大值
}
printf("Case %d: maximum height = %d\n",++kase,ans);
}
}