码迷,mamicode.com
首页 > 其他好文 > 详细

HDOJ(1069)最长下降子序列

时间:2015-08-02 11:26:20      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

每个箱子可有3种叠加方式,所以有3*n个箱子。将箱子按长度由大到小排序,有求箱子按宽度的最长下降子序列的高度之和即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAX(a,b) (a>b)?a:b
#define MIN(a,b) (a>b)?b:a
const int SIZE=100+6;//尽量大一些; 
struct node{
    int l;
    int w;
    int h;
};
node box[3*SIZE];

bool comp(node no1, node no2)
{
    return no1.l > no2.l;
}
int main()
{
    int n;
    int t=0;
    while(scanf("%d",&n)!=EOF&&n!=0)
    {
        for(int i=0;i<n;i++)
        {
            int x,y,z;
            scanf("%d %d %d",&x,&y,&z);
            box[i*3+0].h=x;box[i*3+0].l=MAX(y,z);box[i*3+0].w=MIN(y,z);
            box[i*3+1].h=y;box[i*3+1].l=MAX(x,z);box[i*3+1].w=MIN(x,z);
            box[i*3+2].h=z;box[i*3+2].l=MAX(y,x);box[i*3+2].w=MIN(y,x);
        }
        
        sort(box,box+3*n,comp);
        
        int ans=-1;
        int h[SIZE];
        memset(h,0,sizeof(h));
        for(int i=0;i<3*n;i++)
        {
            h[i]=box[i].h;
            for(int j=0;j<i;j++)
            {
                if(box[i].w<box[j].w&&box[i].l<box[j].l)
                {
                    h[i]=MAX(h[j]+box[i].h,h[i]);
                }
            }
            ans=MAX(h[i],ans);
        }
        printf("Case %d: maximum height = %d\n",++t,ans);
    }
    
    return 0;
}

 

HDOJ(1069)最长下降子序列

标签:

原文地址:http://www.cnblogs.com/program-ccc/p/4695244.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!