您的位置:首页 > 其它

hdu 1069 Monkey and Banana (LIS)

2013-05-25 00:11 477 查看
Problem - 1069

  随便找到的一道题目。

  题意是给出一些的长方体,长方体可以用任意次数,可以任意翻转。如果一个长方体可以叠在另一个长方体上,条件是这个长方体的长和宽严格小于另一个长方体的长和宽。问给出的n种长方体最高可以叠到多高。

  因为长方体有三种不同的面,而且长方体的长和宽要严格小于前一个,所以可以将一个长方体拆成三种不同的面作为底面的长方体,而且假设长总是大于宽的。将长方体按照长和宽排序,然后假设len[i]是放置第i个长方体的时候能得到的最大高度,之后的做法基本上跟LIS的操作一样了。

 代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

struct Node {
int l[3];
} rec[111];

bool cmp(Node a, Node b) {
if (a.l[1] != b.l[1]) return a.l[1] < b.l[1];
return a.l[2] < b.l[2];
}

int len[111];

int main() {
//    freopen("in", "r", stdin);
int n, cas = 1;
while (cin >> n && n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < 3; j++) {
cin >> rec[i * 3].l[j];
}
sort(rec[i * 3].l, rec[i * 3].l + 3);
for (int j = 1; j <= 2; j++) {
rec[i * 3 + j] = rec[i * 3];
swap(rec[i * 3 + j].l[0], rec[i * 3 + j].l[1]);
}
swap(rec[i * 3 + 2].l[0], rec[i * 3 + 2].l[2]);
}
n *= 3;
int mx = 0;
sort(rec, rec + n, cmp);
for (int i = 0; i < n; i++) {
len[i] = 0;
for (int j = 0; j < i; j++) {
if (rec[j].l[1] < rec[i].l[1] && rec[j].l[2] < rec[i].l[2]) {
len[i] = max(len[j], len[i]);
}
}
len[i] += rec[i].l[0];
mx = max(mx, len[i]);
}
printf("Case %d: maximum height = %d\n", cas++, mx);
}
return 0;
}


View Code

——written by Lyon
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: