가장 큰 직사각형 종이 조각

들쭉날쭉한 절반 면(각 격자 면의 길이는 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.

그것을 찾는 방법?

왼쪽과 오른쪽을 확인하고 한 줄이 더 있으면 연속적일 수 있고 그렇지 않으면 잘려서 끊어집니다.

폭력적인 코드:

#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;
}

추천

출처blog.csdn.net/Runcode8/article/details/130668269