思路:感觉跟dp有点关系,就放dp类里了,主要还是模拟思路
对于每一个柱形 K 能得到的最大面积是:(左连续的柱形个数+右连续的柱形个数 )* High[ K ]
而对于求左右连续个数有点像记忆化搜索
mark:
题意:给定n,后面n个数表示上述柱状图的高度(每个柱形底为1)
画一个矩阵,求面积最大是多少
#include
#include
#include
#include
#include
#include
#include
#include
#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]