一张半边参差不齐的网格纸(网格边长均为1),有一边是完整没有破损的。现要从中剪出一片面积最大的矩形纸片。
给定网格纸中完整边的长度N,以及网格中每一列残存部分的高度,输出能够剪出的最大矩形纸片面积。
第一行输入一个正整数N,表示纸片完整边的长度。
第二行输入N个正整数,表示每列格子残存部分的高度,两个正整数之间用一个空格隔开。
输出一个正整数,表示能够剪出的最大矩形纸片面积。
样例输入
6
3 2 1 4 5 2
样例输出
8
可以暴力实现:
依次遍历,每个idx查找高度>=该位置高度的相邻连续的idx的个数,打擂台mx = max (mx, 连续的个数 * idx的高度。
图例:
mx = 3;
mx = 4;
mx = 6;
注:紫色的5应为6
mx = 8;
mx = 8;
mx = 8;
输出8。
那怎么寻找呢?
左右查看,如果行,多一个可以连续的,否则就会被截断,就break了。
暴力代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, mx;
int a[1000009];
int b[1000009];
signed main () {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++) {
b[i] = a[i];
for (int j = i - 1; j >= 1; j--) {
if (a[j] >= a[i]) b[i] += a[i];
else break;
}
for (int j = i + 1; j <= n; j++) {
if (a[j] >= a[i]) b[i] += a[i];
else break;
}
mx = max (mx, b[i]);
}
cout << mx;
return 0;
}