DP 找出 a[i] 的左边和右边与自己连着的比自己大的数的长度 , 然后用这个长度乘以 a[i], 乘积最大的那个就是答案
#include<iostream>
#include<algorithm>
using namespace std;
long long int h[100005];
long long int l[100005];
long long int r[100005];
int main()
{
int n;
while (cin >> n,n)
{
for (int i = 1; i <=n; i++)
{
scanf("%d", &h[i]);
}
l[1] = 1;
r[n] = n;
for (int i = 0; i <= n+1; i++)
{
l[i] = r[i] = i;
}
for (int i = 2; i <= n; i++)
{
int t = i;
while (t >1&&h[t-1] >= h[i])
{
t = l[t-1];
l[i] = t;
}
}
for (int i = n-1; i >= 1; i--)
{
int t = i;
while (t <n&&h[t+1] >= h[i])
{
t = r[t+1];
r[i] = t;
}
}
long long int max1 = -0x3f3f3f3f;
for (int i = 1; i <= n; i++)
{
max1 = max(max1, (r[i] - l[i]+1)*h[i]);
}
cout << max1 << endl;
}
}