zoukankan      html  css  js  c++  java
  • CCF201312-3 最大的矩形(100分)

    试题编号: 201312-3
    试题名称: 最大的矩形
    时间限制: 1.0s
    内存限制: 256.0MB
    问题描述:
    问题描述
      在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。

      请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。
    输入格式
      第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。
      第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。
    输出格式
      输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
    样例输入
    6
    3 1 6 5 2 3
    样例输出
    10


    问题链接:CCF201312试题

    问题描述:首先输入正整数n,接着输入n个正整数表示直方图的一个高度,计算这些直方图中的最大矩形面积。(详见原问题,点击上面的链接)。

    问题分析:解决这个问题,一种是用暴力法(枚举法)来解决,任何一个矩形必然始于第i个直方图,终止于第j块直方图(i<=j),从所有这些面积中找出最大矩形面积即可;另外一种办法是对这n个数只看一遍,就算出最大矩形面积,其计算复杂度为O(n),相比较而言,算法要复杂一些,还需要付出空间的代价。

    程序说明:本程序采用暴力法实现,数据用数组来存储。另外一种数据存储方法是使用STL的包装类vector,可以实现动态数据存储,不受限于数据的多少。

    参见:CCF201312-3 最大的矩形(解法二)(100分)

    提交后得100分的C++语言程序如下:

    /* CCF201312-3 最大的矩形 */
    
    #include <iostream>
    
    using namespace std;
    
    const int N = 1000;
    int h[N];
    
    int main()
    {
        int n, ans, height, area;
    
        // 输入数据
        cin >> n;
        for(int i=0; i<n; i++)
            cin >> h[i];
    
        // 计算最大矩形面积:暴力法(枚举法)
        ans = 0;
        for(int i=0; i<n; i++) {
            height = h[i];
            for(int j=i; j<n; j++) {
                if(h[j] < height)
                    height = h[j];
                area = (j - i + 1) * height;
                if(area > ans)
                    ans = area;
            }
        }
    
        // 输出结果
        cout << ans << endl;
    
        return 0;
    }


  • 相关阅读:
    HDU4366 Successor 线段树+预处理
    POJ2823 Sliding Window 单调队列
    HDU寻找最大值 递推求连续区间
    UVA846 Steps 二分查找
    HDU3415 Max Sum of MaxKsubsequence 单调队列
    HDU时间挑战 树状数组
    UVA10168 Summation of Four Primes 哥德巴赫猜想
    UESTC我要长高 DP优化
    HDUChess 递推
    HDU4362 Dragon Ball DP+优化
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564195.html
Copyright © 2011-2022 走看看