1. 程式人生 > >HDU 1069 Monkey and Banana

HDU 1069 Monkey and Banana

分類

HDU 動態規劃 貪心

題意

題意是堆箱子、要求上面的箱子的長和寬都小於下面箱子的長和寬

想法

因為每塊磚有三種擺法(高和底面積不同),可以把這三種情況當成不同的三塊磚,加入brick陣列中。注意,一定要分清長和寬,長要比寬長,這樣在後面dp的過程中可以保證長邊和長邊比較、短邊和短邊比較。
所以

  1. 要麼保證長比寬長,每次錄入3個面
  2. 要麼每次錄入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); } }