• 《Cracking the Coding Interview》——第11章:排序和搜索——题目7


    2014-03-21 22:05

    题目:给你N个盒子堆成一座塔,要求下面盒子的长和宽都要严格大于上面的。问最多能堆多少个盒子?

    解法1:O(n^2)的动态规划解决。其实是最长递增子序列问题,所以也可以用O(n * log(n))的优化算法。

    代码:

    // 11.7 n boxes are to stack up to a tower. Every box must be strictly smaller in width and height than the one right below it.
    // How many boxes at most can you stack up?
    #include <algorithm>
    #include <cstdio>
    #include <vector>
    using namespace std;
    
    struct Box {
        int x;
        int y;
        Box(int _x = 0, int _y = 0): x(_x), y(_y) {};
        
        bool operator < (const Box &other) {
            if (x != other.x) {
                return x < other.x;
            } else {
                return y < other.y;
            }
        };
    };
    
    int main()
    {
        vector<Box> v;
        vector<int> dp;
        int n;
        int i, j;
        int res;
        
        while (scanf("%d", &n) == 1 && n > 0) {
            v.resize(n);
            for (i = 0; i < n; ++i) {
                scanf("%d%d", &v[i].x, &v[i].y);
            }
            sort(v.begin(), v.end());
            dp.resize(n);
            res = 0;
            for (i = 0; i < n; ++i) {
                dp[i] = 1;
                for (j = 0; j < i; ++j) {
                    if (v[j].x < v[i].x && v[j].y < v[i].y) {
                        dp[i] = dp[j] + 1 > dp[i] ? dp[j] + 1 : dp[i];
                    }
                }
                res = dp[i] > res ? dp[i] : res;
            }
            printf("%d
    ", res);
            
            v.clear();
            dp.clear();
        }
        
        return 0;
    }

    解法2:用二分查找优化后的代码,其中使用了STL算法库提供的lower_bound(),二分也不总是要手写的。

    代码:

     1 // 11.7 n boxes are to stack up to a tower. Every box must be strictly smaller in width and height than the one right below it.
     2 // How many boxes at most can you stack up?
     3 #include <algorithm>
     4 #include <cstdio>
     5 #include <vector>
     6 using namespace std;
     7 
     8 struct Box {
     9     int x;
    10     int y;
    11     Box(int _x = 0, int _y = 0): x(_x), y(_y) {};
    12     
    13     bool operator < (const Box &other) {
    14         if (x != other.x) {
    15             return x < other.x;
    16         } else {
    17             return y < other.y;
    18         }
    19     };
    20 };
    21 
    22 int main()
    23 {
    24     vector<Box> v;
    25     vector<int> dp;
    26     vector<int>::iterator it;
    27     int n;
    28     int i;
    29     
    30     while (scanf("%d", &n) == 1 && n > 0) {
    31         v.resize(n);
    32         for (i = 0; i < n; ++i) {
    33             scanf("%d%d", &v[i].x, &v[i].y);
    34         }
    35         sort(v.begin(), v.end());
    36         dp.push_back(v[0].y);
    37         for (i = 1; i < n; ++i) {
    38             if (v[i].y > dp[dp.size() - 1]) {
    39                 dp.push_back(v[i].y);
    40             } else {
    41                 it = lower_bound(dp.begin(), dp.end(), v[i].y);
    42                 *it = v[i].y;
    43             }
    44         }
    45         printf("%d
    ", (int)dp.size());
    46         
    47         v.clear();
    48         dp.clear();
    49     }
    50     
    51     return 0;
    52 }
  • 相关阅读:
    公告Ext3.3Bate发布了——PivotGrids, Calendars and 更多其他改进
    纪念一起工作三年的朋友的离开
    基于Ext.Panel扩展一个BMap
    Bing Map App 开发 还没入门遇见错误无法继续
    遗传算法学习笔记(2)
    接下来的目标
    Silverlight游戏开发心得(4)——重读调度器
    遗传算法学习笔记(5)
    Silverlight游戏开发心得(3)——有限状体机
    遗传算法学习笔记(4)
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3616836.html
Copyright © 2020-2023  润新知