HDU

来源:互联网 发布:linux查看gtk版本 编辑:程序博客网 时间:2024/06/05 05:42
题目链接:https://vjudge.net/problem/19392/origin

题意:给你n种长方体,每种有无数个,现在问你把一个个长方体往上叠(上面一个的长和宽要小于下面的长和宽)能叠出的最大高度是多少

思路:首先确定好长和宽(定义好长大于宽),然后每种长方体就可以有三种,存好这些长方体之后将他们按x,y从大到小排序,dp【i】表示以i为堆顶的最大高度,最后就可以从大到小依次推出dp【i】,具体见代码。


代码:

#include <bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;typedef long long LL;typedef pair<int, int> P;const int maxn = 1e6 + 5;int n;int dp[105];struct node {    int x, y, z;} a[105];bool cmp(node q, node w) {    if (q.x != w.x) return q.x > w.x;    else return q.y > w.y;}int k=0;int main() {    //freopen ("in.txt", "r", stdin);    while (~scanf ("%d", &n) && n) {        memset(dp, 0, sizeof(dp));        int tmp = 1;        int x, y, z;        for (int i = 1; i <= n; i++) {            scanf ("%d%d%d", &x, &y, &z);            a[tmp].x = x > y ? x : y;            a[tmp].y = x > y ? y : x;            a[tmp++].z = z;            a[tmp].x = x > z ? x : z;            a[tmp].y = x > z ? z : x;            a[tmp++].z = y;            a[tmp].x = z > y ? z : y;            a[tmp].y = z > y ? y : z;            a[tmp++].z = x;        }        sort(a + 1, a + tmp + 1, cmp);        for (int i = 1; i < tmp; i++) dp[i] = a[i].z;//需要从大到小算出来,那么每个dp就初始化为自己的高度,后面就直接加上就行了        int ans = -INF;        for (int i = 1; i < tmp; i++) {            for (int j = 1; j < i; j++) {                if (a[i].x < a[j].x && a[i].y < a[j].y)                    dp[i] = max(dp[i], dp[j] + a[i].z);                ans = max(ans, dp[i]);            }        }        printf ("Case %d: maximum height = %d\n",++k, ans);    }    return 0;}






原创粉丝点击