2014-03-20 04:15

题目:你有n个盒子,用这n个盒子堆成一个塔,要求下面的盒子必须在长宽高上都严格大于上面的。如果你不能旋转盒子变换长宽高,这座塔最高能堆多高?

解法:首先将n个盒子按照长宽高顺序排好序,然后动态规划,我写了个O(n^2)时间复杂度的代码。

代码:

 1 // 9.10 A stack of n boxes is form a tower. where every stack must be strictly larger than the one right above it.
 2 // The boxes cannot be rotated.
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <vector>
 6 using namespace std;
 7 
 8 struct Box {
 9     // width
10     int w;
11     // height
12     int h;
13     // depth
14     int d;
15     Box(int _w = 0, int _h = 0, int _d = 0): w(_w), h(_h), d(_d) {};
16     
17     bool operator < (const Box &other) {
18         if (w != other.w) {
19             return w < other.w;
20         } else if (h != other.h) {
21             return h < other.h;
22         } else {
23             return d < other.d;
24         }
25     };
26 };
27 
28 int main()
29 {
30     int n, i, j;
31     Box box;
32     vector<Box> v;
33     vector<int> dp;
34     int result;
35     
36     while (scanf("%d", &n) == 1 && n > 0) {
37         v.resize(n);
38         for (i = 0; i < n; ++i) {
39             scanf("%d%d%d", &v[i].w, &v[i].h, &v[i].d);
40         }
41         sort(v.begin(), v.end());
42         dp.resize(n);
43         for (i = 0; i < n; ++i) {
44             dp[i] = v[i].h;
45         }
46         for (i = 0; i < n; ++i) {
47             for (j = 0; j < i; ++j) {
48                 if (v[i].w > v[j].w && v[i].h > v[j].h && v[i].d > v[j].d) {
49                     dp[i] = v[i].h + dp[j] > dp[i] ? v[i].h + dp[j] : dp[i];
50                 }
51             }
52         }
53         result = dp[0];
54         for (i = 1; i < n; ++i) {
55             result = dp[i] > result ? dp[i] : result;
56         }
57         v.clear();
58         dp.clear();
59         printf("%d\n", result);
60     }
61     
62     return 0;
63 }

 

 posted on 2014-03-20 04:16  zhuli19901106  阅读(314)  评论(0编辑  收藏  举报