#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
void upt(map<int,int> &f,int j,int v){
	if(!f.count(j)) f[j]=v;
	else f[j]=min(f[j],v);
}
map<int,int> f[N];
// f_{i,j} 表示代价为 j 时,最小的状态 c_i 是多少. 
int n,a[N];
signed main(){
	cin>>n;
	for(int i=1;i<=n;++i)
		cin>>a[i];
	f[1][0]=a[1]; f[1][1]=0;
	for(int i=2;i<=n;++i){
		for(auto [v,j]:f[i-1]){
			if(f[i-1].begin()->first < v-2) break;
			if(j+min(a[i]-a[i-1],0)>0) upt(f[i],v+2,0);
			if(j+min(a[i]-a[i-1],0)<=a[i]) upt(f[i],v+1,max(0,j+min(a[i]-a[i-1],0)));
			if(j+max(a[i]-a[i-1],0)<=a[i]) upt(f[i],v,j+max(a[i]-a[i-1],0)); 
		}
	}
	int ans=1e9;
	for(auto [v,j]:f[n])
		ans=min(ans,v+(j!=0));
	cout<<ans;
	return 0; 
}