#include<iostream> #include<algorithm> #include<vector> #include<string> #include<utility> #include<map> #include<set> #include<queue> #include<stack> #include<functional> #include<math.h> using namespace std; #define N (1000000000+7) #define M (998244353) #define INF 1e16 typedef long long ll; typedef pair<int,int> P; template <typename T> struct SegmentTree{ typedef function<T(T,T)> F; int n; F f; T unit; vector<T> dat; SegmentTree(){}; SegmentTree(int newn,F f,T t):f(f),unit(t){ init(newn); } SegmentTree(const vector<T> &v,F f,T t):f(f),unit(t){ int n_ = v.size(); init(n_); for(int i=0;i<n_;i++)dat[n+i]=v[i]; for(int i=n-1;i;i--){ dat[i]=f(dat[(i<<1)|0],dat[(i<<1)|1]); } } void init(int n_){ n=1; while(n<n_)n<<=1; dat.assign(n<<1,unit); } void update(int k,T x){ dat[k+=n]=x; while(k>>=1) dat[k]=f(dat[(k<<1)|0],dat[(k<<1)|1]); } T query(int a,int b){ T vl=unit,vr=unit; for(int l=a+n,r=b+n;l<r;l>>=1,r>>=1){ if(l&1)vl=f(vl,dat[l++]); if(r&1)vr=f(dat[--r],vr); } return f(vl,vr); } }; SegmentTree<ll> dp[1010]; int main(void){ int n; cin>>n; vector<int>a(n); for(int i=0;i<n;i++)cin>>a[i]; auto f = [](ll a,ll b){ return min(a,b); }; for(int i=0;i<=n;i++){ if(i==0) { dp[i] = SegmentTree<ll>(10001,f,(ll)INF); dp[i].update(0,0); } else dp[i] = SegmentTree<ll>(10001,f,(ll)INF); } for(int i=0;i<n;i++){ for(int j=0;j<10001;j++){ ll A = dp[i].query(0,j+1); if(dp[i+1].query(j,j+1)>A+abs(a[i]-j)){ dp[i+1].update(j,A+abs(a[i]-j)); } } } ll res = (ll)INF; for(int i=0;i<10001;i++)res = min(dp[n].query(i,i+1),res); cout<<res<<endl; }