这个题跟13年的noip day2 第一题很像,不过多了一个竖着刷,联赛的时候我曾有过这种错误的想法,不过没想到是这道题的正解。。。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int save[6000],n;
int solve(int l,int r)
{
int ans;
int len=r-l+1;
int height=save[l];
for(int i=l;i<=r;i++)
if(save[i]<height)
height=save[i];
ans=height;
for(int i=l;i<=r;i++)
save[i]-=height;
for(int i=l;i<=r;i++)
{
if(save[i])
{
int ll=i;
int j=i;
while(save[j])
j++;
int rr=j-1;
ans+=solve(ll,rr);
}
}
return min(ans,len);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&save[i]);
}
int ans=solve(1,n);
printf("%d",ans);
return 0;
}