andre_joy

导航

hdu 1069

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1069

题意:给定若干个木块长宽高,长宽高可以自己调整,求堆积起来最高的高度。

mark:枚举所有木块长宽高可能情况,简单dp。

代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int x,y,z;
}block;

int cmp1(const void *a, const void *b)
{
    block *p = (block *)a, *q = (block *)b;
    if(p->x != q->x) return q->x - p->x;
    return q->y - p->y;
}

int cmp2(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;
}

int main()
{
    block b[100];
    int n,m,dp[100],a[3];
    int i,j,k,max;
    k = 0;
    while(scanf("%d", &n), n)
    {
        for(i = m = 0; i < n; i++)
        {
            scanf("%d%d%d", a, a+1, a+2);
            qsort(a, 3, 4, cmp2);
            if(a[0] == a[1] && a[0] == a[2])
            {
                b[m].x = b[m].y = b[m].z = a[0];
                m++;
            }
            else if(a[0] == a[1])
            {
                b[m].x = a[2];
                b[m].y = b[m].z = a[0];
                m++;
                b[m].x = b[m].y = a[0];
                b[m++].z = a[2];
            }
            else if(a[1] == a[2])
            {
                b[m].x = b[m].z = a[1];
                b[m].y = a[0];
                m++;
                b[m].x = b[m].y = a[1];
                b[m++].z = a[0];
            }
            else
            {
                b[m].x = a[2];
                b[m].y = a[1];
                b[m++].z = a[0];
                b[m].x = a[2];
                b[m].y = a[0];
                b[m++].z = a[1];
                b[m].x = a[1];
                b[m].y = a[0];
                b[m++].z = a[2];
            }
        }
        qsort(b, m, sizeof(b[0]), cmp1);
        for(i = max = 0; i < m; i++)
        {
            dp[i] = b[i].z;
            for(j = 0; j < i; j++)
                if(b[i].x < b[j].x && b[i].y < b[j].y)
                    if(dp[i] < dp[j]+b[i].z) dp[i] = dp[j]+b[i].z;
            if(max < dp[i]) max = dp[i];
        }
        printf("Case %d: maximum height = %d\n", ++k, max);
    }
    return 0;
}

posted on 2012-07-10 23:40  andre_joy  阅读(152)  评论(0编辑  收藏  举报