HDU1069 Monkey and Banana 简单dp

题意:

把给定的长方体(不限)叠加在一起,叠加的条件是,上面一个长方体的长和宽都比下面长方体的长和宽短;

求这些长方体能叠加的最高的高度.(其中(3,2,1)可以摆放成(3,1,2)、(2,1,3)等).

/* ***********************************************
Author        :devil
Created Time  :2015/12/7 20:38:42
************************************************ */

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cstdio>
using namespace std;
struct wq
{
    int a,b,c;
}p[100];
int dp[100],cnt;
void add(int x,int y,int z)
{
    p[cnt].a=x;
    p[cnt].b=y;
    p[cnt++].c=z;
}
bool cmp(wq a,wq b)
{
    if(a.a!=b.a) return a.a>b.a;
    return a.b>b.b;
}
int main()
{
    //freopen("in.txt","r",stdin);
    int n,x,y,z,cas=1;
    while(~scanf("%d",&n)&&n)
    {
        cnt=0;
        for(int i=0; i<n; i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            if(x>y) swap(x,y);
            if(x>z) swap(x,z);
            if(y>z) swap(y,z);
            add(x,y,z);
            add(y,z,x);
            add(x,z,y);
        }
        sort(p,p+cnt,cmp);
        dp[0]=p[0].c;
        int ans=dp[0];
        for(int i=1;i<cnt;i++)
        {
            dp[i]=p[i].c;
            for(int j=0;j<i;j++)
                if(p[i].a<p[j].a&&p[i].b<p[j].b) dp[i]=max(dp[i],dp[j]+p[i].c);
            ans=max(ans,dp[i]);
        }
        printf("Case %d: maximum height = %d\n",cas++,ans);
    }
    return 0;
}

 

posted on 2015-12-07 22:29  恶devil魔  阅读(336)  评论(0编辑  收藏  举报

导航