HDU 1069(最长下降子序列)

来源:互联网 发布:华为t8300数据恢复 编辑:程序博客网 时间:2024/06/06 10:43

题意:给n种类型的箱子,每种类型提供无限的数量。要求把这些箱子尽量叠高,上一层箱子的长宽必须都比下一层的箱子小,求可以叠的最高高度。

 

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAXN 120#define MAX(a, b) ((a) > (b) ? (a) : (b))#define MIN(a, b) ((a) > (b) ? (b) : (a))struct Block{    int x, y, z;    Block() {}    void add(int _x, int _y, int _z)    {        z = _z;        x = MAX(_x, _y);        y = MIN(_x, _y);    }    bool operator <(const Block& rhs) const    {        return x < rhs.x && y < rhs.y;    }} block[MAXN];bool cmp(const Block& lhs, const Block& rhs){    if (lhs.x == rhs.x)        return lhs.y > rhs.y;    return lhs.x > rhs.x;}int F[MAXN];int main(){    int n, i, j, x, y, z, max, cases = 0;    while (scanf("%d", &n) != EOF && n)    {        for (i = 0; i < n; ++i)        {            scanf("%d%d%d", &x, &y, &z);            block[i*3].add(x, y, z);            block[i*3+1].add(x, z, y);            block[i*3+2].add(y, z, x);        }        n *= 3;        sort(block, block+n, cmp);        max = F[0] = block[0].z;        for (i = 1; i < n; ++i)        {            F[i] = block[i].z;            for (j = 0; j < i; ++j)            {                if (block[i] < block[j] && F[i] < F[j] + block[i].z)                    F[i] = F[j] + block[i].z;            }            max = MAX(F[i], max);        }        printf("Case %d: maximum height = %d\n", ++cases, max);    }    return 0;}


 

0 0
原创粉丝点击