半辺がギザギザになった方眼紙 (方眼の各辺の長さが 1)、片面は無傷で損傷していません。次に、最大面積の長方形の紙を切り出す必要があります。
方眼紙の完全な辺の長さ N と、方眼紙の各列の残りの部分の高さを指定して、切り出すことができる最大の長方形の紙領域を出力します。
最初の行には、用紙の完全な辺の長さを表す正の整数 N が入力されます。
2 行目には、グリッドの各列の残りの部分の高さを示す N 個の正の整数を入力し、2 つの正の整数をスペースで区切ります。
切り取ることができる最大の長方形の紙の面積を表す正の整数を出力します。
サンプル入力
6
3 2 1 4 5 2
サンプル出力
8
ブルートフォース攻撃が可能:
順番にトラバースして、各 idx は、高さがその位置の高さ以上で、アリーナ mx = max (mx、連続する数字の数 * idx の高さ) である隣接する連続する idx の数を検索します。
伝説:
mx = 3;
mx = 4;
mx = 6;
注: 紫の 5 は 6 である必要があります。
mx = 8;
mx = 8;
mx = 8;
出力8。
どうやって見つけますか?
左右を確認して、あと1行あれば連続、そうでなければ切り捨てられて途切れます。
暴力的なコード:
#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;
}