zoukankan      html  css  js  c++  java
  • 《Cracking the Coding Interview》——第9章:递归和动态规划——题目10

    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
    ", result);
    60     }
    61     
    62     return 0;
    63 }
  • 相关阅读:
    魅族--魅蓝metal
    小米2015.11.24 雷军:我所有的向往
    微软2015.10.4发布会
    创意app1
    奇怪的想法2
    奇怪想法1
    对不起,我爱你(悲剧,慎入)
    聊聊台式机1
    聊聊笔记本1--人生第一台笔记本
    聊聊路由器1
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3612801.html
Copyright © 2011-2022 走看看