#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) {
  if (a % b == 0)
    return b;
  else
    return gcd(b, a % b);
}
long long fastexpo(long long a, long long b) {
  long long res = 1;
  while (b > 0) {
    if (b % 2 == 1)
      res = (((res) % 1000000007) * ((a) % 1000000007)) % 1000000007;
    a = (((a) % 1000000007) * ((a) % 1000000007)) % 1000000007;
    b /= 2;
  }
  return res;
}
long long fastexpom(long long a, long long b, long long m) {
  long long res = 1;
  while (b > 0) {
    if (b % 2 == 1) res = (((res) % m) * ((a) % m)) % m;
    a = (((a) % m) * ((a) % m)) % m;
    b /= 2;
  }
  return res;
}
long long modinv(long long a, long long m = 1000000007) {
  return fastexpom(a, m - 2, m);
}
bool cmp(pair<pair<int, int>, int> p1, pair<pair<int, int>, int> p2) {
  return p1.first.second < p2.first.second;
}
vector<int> v;
long long rec(int i, int j, int h) {
  int mh = 1e9 + 5;
  for (int k = i; k <= j; k++) {
    mh = min(mh, v[k]);
  }
  int lans = 0;
  int p = i;
  for (int k = i; k <= j; k++) {
    if (v[k] == mh) {
      if (k != p) {
        lans += rec(p, k - 1, mh);
        p = k + 1;
      } else
        p = k + 1;
    }
  }
  if (p <= j) lans += rec(p, j, mh);
  return min(lans + mh - h, j - i + 1);
}
int main() {
  int n;
  cin >> n;
  v.resize(n + 1);
  for (int i = 0; i < n; i++) cin >> v[i + 1];
  cout << rec(1, n, 0);
  return 0;
}
