hdu 1069 Monkey and Banana (LIS)
随便找到的一道题目。
题意是给出一些的长方体,长方体可以用任意次数,可以任意翻转。如果一个长方体可以叠在另一个长方体上,条件是这个长方体的长和宽严格小于另一个长方体的长和宽。问给出的n种长方体最高可以叠到多高。
因为长方体有三种不同的面,而且长方体的长和宽要严格小于前一个,所以可以将一个长方体拆成三种不同的面作为底面的长方体,而且假设长总是大于宽的。将长方体按照长和宽排序,然后假设len[i]是放置第i个长方体的时候能得到的最大高度,之后的做法基本上跟LIS的操作一样了。
代码如下:
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 5 using namespace std; 6 7 struct Node { 8 int l[3]; 9 } rec[111]; 10 11 bool cmp(Node a, Node b) { 12 if (a.l[1] != b.l[1]) return a.l[1] < b.l[1]; 13 return a.l[2] < b.l[2]; 14 } 15 16 int len[111]; 17 18 int main() { 19 // freopen("in", "r", stdin); 20 int n, cas = 1; 21 while (cin >> n && n) { 22 for (int i = 0; i < n; i++) { 23 for (int j = 0; j < 3; j++) { 24 cin >> rec[i * 3].l[j]; 25 } 26 sort(rec[i * 3].l, rec[i * 3].l + 3); 27 for (int j = 1; j <= 2; j++) { 28 rec[i * 3 + j] = rec[i * 3]; 29 swap(rec[i * 3 + j].l[0], rec[i * 3 + j].l[1]); 30 } 31 swap(rec[i * 3 + 2].l[0], rec[i * 3 + 2].l[2]); 32 } 33 n *= 3; 34 int mx = 0; 35 sort(rec, rec + n, cmp); 36 for (int i = 0; i < n; i++) { 37 len[i] = 0; 38 for (int j = 0; j < i; j++) { 39 if (rec[j].l[1] < rec[i].l[1] && rec[j].l[2] < rec[i].l[2]) { 40 len[i] = max(len[j], len[i]); 41 } 42 } 43 len[i] += rec[i].l[0]; 44 mx = max(mx, len[i]); 45 } 46 printf("Case %d: maximum height = %d\n", cas++, mx); 47 } 48 return 0; 49 }
——written by Lyon