#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define REP(i,n) for(int i=0;i<(n);i++)
#define fi first
#define se second
#define pb push_back
#define mp make_pair
using namespace std;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef long long ll;

template<class T> void read(T &x){
	int f=0; x=0; char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) f|=(ch=='-');
	for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
	if(f) x=-x;
}

const int N=200005;
ll f[N][4],bas[N],a[N],c[N],n,m;

int main(){
	read(n);
	rep(i,1,n){
		read(a[i]);
		c[++m]=a[i]-a[i-1];
		if(c[m]==0) m--;
	}
	c[++m]=-a[n];
	if(c[m]==0) m--;
	n=m;
	rep(i,1,n){
		a[i]=a[i-1]+c[i];
	}

//	rep(i,1,n) printf("@ %d : %lld\n",i,c[i]);
/*
本来以为要利用斜率单调性，set维护DP。。
然鹅暴力DP都WA了。。
对拍才发现有一个点同时一进一出这种Case。。
那么就是O(n)的了233。。。
日常忽略Case/胡假结论QwQ

好题，好题。。maroonk orz

	assert(n<=2001);
	memset(f,0xc0,sizeof f);
	f[0][0]=0;
	rep(i,1,n){
		if(c[i]>=0){
			rep(j,0,i){
				f[i][j]=f[i-1][j];
				if(j){
					f[i][j]=max(f[i][j],f[i-1][j-1]+c[i]);
				}
			}
		}
		else if(c[i]<0){
			rep(j,0,i){
				if(f[i-1][j]>=-c[i]){
					f[i][j]=min(a[i],f[i-1][j]+c[i]);
				}
				if(j){
					f[i][j]=max(f[i][j],min(f[i-1][j-1],a[i]));
				}
			}
		}
		rep(j,2,i) if(f[i][j-2]>=0){
			f[i][j]=max(f[i][j],a[i]);
		}
		
		rep(j,0,i){
			if(f[i][j]<0) putchar('#'),putchar(' ');
			else printf("%lld ",f[i][j]);
		}
		puts("");
		
	}
	ll cur=0;
	while(f[n][cur]<0) cur++;
	cout<<cur<<endl;

	return 0;

6
4 9 20 12 10 8 

8
8 4 6 2 8 1 5 2 

*/

	memset(f,0xc0,sizeof f);
	f[0][0]=0;
	rep(i,1,n){
		bas[i]=bas[i-1];
		rep(_j,bas[i],min(i,(int)bas[i]+3)){
			int j=_j-bas[i];
			if(c[i]>0){
				f[i][j]=f[i-1][j];
				if(j){
					f[i][j]=max(f[i][j],f[i-1][j-1]+c[i]);
				}
			}
			else{
				if(f[i-1][j]>=-c[i]){
					f[i][j]=min(a[i],f[i-1][j]+c[i]);
				}
				if(j){
					f[i][j]=max(f[i][j],min(f[i-1][j-1],a[i]));
				}
			}
		}
		rep(_j,max(2,(int)bas[i]),min(i,(int)bas[i]+3)){
			int j=_j-bas[i];
			if(j>=2&&f[i][j-2]>=0){
				f[i][j]=max(f[i][j],a[i]);
			}
		}
		if(f[i][0]<0){
			bas[i]++;
			rep(j,0,2){
				f[i][j]=f[i][j+1];
			}
			f[i][3]=-1e18;
		}
	}
	cout<<bas[n]<<endl;

    return 0;
}