【CSP】最大的矩形

问题描述
试题编号: 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
 
 
My Solution:
 1 #include <stdio.h>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int num[1001];
 6 int s[1001]; //面积
 7 
 8 int main()  {
 9     int n;
10     scanf("%d", &n);
11     for(int i = 0; i < n; i++)  {
12         scanf("%d", &num[i]);
13     }
14     for(int i = 0; i < n; i++)  {
15         int last = 0;
16         int middle = i;
17         int count = 0;
18         while(last < i) {
19             if(num[last] >= num[i]){
20                 count++;
21             }
22             else {
23                 count = 0;
24             }
25             last++;
26         }
27 
28         while(middle < n)   {
29             if(num[middle] >= num[i]){
30                 count++;
31             }
32             else{
33                 break;
34             }
35             middle++;
36         }
37         // cout << "count" << i << " " << count << endl;
38         s[i] = count * num[i];
39     }
40     int maxS = 0;
41     for(int i = 0; i < n; i++)  {
42         // cout << s[i] << endl;
43         if(s[i] > maxS) {
44             maxS = s[i];
45         }
46     }
47     
48     printf("%d
", maxS);
49     
50     return 0;
51 }

标准答案:

 1 #include <iostream> 
 2 #include <cstdio>
 3 #include <string> 
 4 #include <vector> 
 5 #include <deque>
 6 #include <list>
 7 using namespace std;
 8 int main() {
 9     int n;
10     vector<int> a;
11     cin >> n;
12     for (int i = 0; i < n; i++) {
13         int x;
14         cin >> x; a.push_back(x);
15     }
16     int ans = 0;
17     for (int i = 0; i < n; i++) {
18         int h = a[i];
19         for (int j = i; j < n; j++) {
20             if (a[j] < h)
21                 h = a[j];
22             int s = (j - i + 1) * h; if (ans < s)
23                 ans = s; }
24         
25     }
26     cout << ans << endl;
27     return 0;
28 }
原文地址:https://www.cnblogs.com/QingHuan/p/6544987.html