单调栈也可以做。
这里练DP就不用单调栈了。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100000+10;
typedef long long ll;
ll s[maxn];
ll dp[maxn];
int l[maxn],r[maxn];
int n;
int main()
{
while(cin >> n &&n)
{
for(int i=0; i<n; i++)
{
cin >> s[i];
}
l[0] = 0;
r[n-1] = n-1;
for(int i=1; i<n; i++)
{
int t = i;
while(t>0 && s[t-1]>=s[i])
{
t = l[t-1];
// cout <<"&"<<endl;
}
l[i] = t;
}
for(int i=n-2; i>=0; i--)
{
int t = i;
while(t<n-1 && s[t+1]>=s[i])
{
t = r[t+1];
//cout << r[n-1] <<endl;
}
r[i] = t;
}
ll Max = 0;
for(int i=0; i<n; i++)
{
if(s[i]*(r[i]-l[i]+1)>Max)
{
Max = s[i]*(r[i]-l[i]+1);
}
}
cout << Max <<endl;
}
return 0;
}