思路:感覺跟dp有點關系,就放dp類裡了,主要還是模擬思路 對於每一個柱形 K 能得到的最大面積是:(左連續的柱形個數+右連續的柱形個數 )* High[ K ] 而對於求左右連續個數有點像記憶化搜索 mark:
題意:給定n,後面n個數表示上述柱狀圖的高度(每個柱形底為1)
畫一個矩陣,求面積最大是多少
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cctype>
#include <queue>
#include <vector>
#define inf 1000000000
#define N 100010
#define ll __int64
using namespace std;
ll a[N],l[N],r[N];//l[i] 表示從 l[i] 到 i 都是連續>=a[i]的數
inline ll Max(ll a,ll b){return a>b?a:b;}
int main(){
int n,i,j,step,temp;
while(scanf("%d",&n),n){
a[0]=0;
for(i=1;i<=n;i++)scanf("%I64d",&a[i]),l[i]=r[i]=i;
for(i=1;i<=n;i++)
while(l[i]>1 && a[i]<=a[l[i]-1])l[i]=l[l[i]-1];
for(i=n;i>=1;i--)
while(r[i]<n && a[i]<=a[r[i]+1])r[i]=r[r[i]+1];
ll ans=0;
for(i=1;i<=n;i++)
ans=Max(ans,(r[i]-l[i]+1)*a[i]);
printf("%I64d\n",ans);
}
return 0;
}