简单说下思路哈:
我们都知道单调栈可以求出左边第一个比自己小的数,那么其实这道题目我们只要线性复杂度求出最左边第一个比自己小的数和最右边比自己小的数就可以,比较麻烦的是最右边的,我们可以反转一遍数组,然后简单推导一下就可以求出等价最右边比自己小的数
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
stack<int>s;
int n,a[N],ans,l[N],r[N];
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++){
while(s.size()&&a[s.top()]>=a[i])s.pop();
if(s.size())l[i]=s.top();
else l[i]=0;
s.push(i);
}
while(s.size())s.pop();
reverse(a+1,a+1+n);
for(int i=1;i<=n;i++){
while(s.size()&&a[s.top()]>=a[i])s.pop();
if(s.size())r[i]=s.top();
else r[i]=0;
s.push(i);
}
reverse(a+1,a+1+n);
for(int i=1,j=n;i<=n;i++,j--){
ans=max(ans,(n-r[j]-l[i])*a[i]);
//cout<<l[i]<<" "<<r[j]<<" "<<endl;
}
cout<<ans<<endl;
}