#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
struct node {int mndp,mndpa;};
node merge(node a,node b) {return {min(a.mndp,b.mndp),min(a.mndpa,b.mndpa)};}
template <class T> class segment {
private:
int id(int l,int r){return (l+r)|(l!=r);}
void change(int l,int r,int x,T &y){if(l==r){seg[id(l,r)]=y;return;}int mid=(l+r)/2;if(x<=mid)change(l,mid,x,y);else change(mid+1,r,x,y);seg[id(l,r)]=merge(seg[id(l,mid)],seg[id(mid+1,r)]);}
T query(int L,int R,int l,int r){if(l<=L&&R<=r)return seg[id(L,R)];int mid=(L+R)/2;if(l<=mid&&r>mid)return merge(query(L,mid,l,r),query(mid+1,R,l,r));if(l<=mid)return query(L,mid,l,r);return query(mid+1,R,l,r);}
public:
vector<T> seg;int siz;
segment(int n){siz=n;seg.resize(2*n+4);}
void change(int x,T y){change(1,siz,x,y);}
T query(int l,int r){return query(1,siz,l,r);}
};
const int MOD=998244353;
int n,a[2001],b[2001],dp[2001][2001],answer;
void Delta() {
cin >> n;vector<int> Q;
for(int i=1;i<=n;++i) {
cin >> a[i];a[i]-=69;
Q.push_back(a[i]);
}
Q.push_back(-2147483647);sort(Q.begin(),Q.end());
Q.resize(unique(Q.begin(),Q.end())-Q.begin());
for(int i=1;i<=n;++i) {
dp[i][1]=0;
b[i]=lower_bound(Q.begin(),Q.end(),a[i])-Q.begin();
}
for(int x=2;x<=n;++x) {
segment<node> P(n);
for(int i=1;i<=n;++i) dp[i][x]=2147483647;
for(auto &i:P.seg) i={2147483647,2147483647};
for(int i=1;i<=n;++i) {
dp[i][x]=min(dp[i][x],P.query(b[i],n).mndp);
dp[i][x]=min((long long)dp[i][x],(long long)P.query(1,b[i]).mndpa+a[i]);
P.change(b[i],{dp[i][x-1],dp[i][x-1]-a[i]});
}
}
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(dp[i][j]<=a[i])
answer=max(answer,j);
cout << answer << endl;
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
Delta();
}