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;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- 服务器基本框架
- windows/linux内存管理
- LeetCode.697 Degree of an Array
- 2017ACM/ICPC亚洲区沈阳站_Infinite Fraction Path(BFS)
- 判断平衡二叉树是否平衡
- HDU
- 队列的表示和基本操作的实现
- 正则表达式速查表
- 测试文档功能
- 调查:热水器穿个wifi马甲价格就翻倍 物联网不亲民
- Spring命名空间p的属性注入的方式
- ①tiny4412 Linux驱动开发之蜂鸣器
- Android开发—智能家居系列----UDP通信发送指令
- 使用Keras和Tensorflow检测恶意请求