You have a multiset containing several integers. Initially, it contains a_1 elements equal to 1, a_2 elements equal to 2, ..., a_n elements equal to n.

You may apply two types of operations:

  * choose two integers l and r (l ≤ r), then remove one occurrence of l, one occurrence of l + 1, ..., one occurrence of r from the multiset. This operation can be applied only if each number from l to r occurs at least once in the multiset; 
  * choose two integers i and x (x ≥ 1), then remove x occurrences of i from the multiset. This operation can be applied only if the multiset contains at least x occurrences of i. 



What is the minimum number of operations required to delete all elements from the multiset?

Input

The first line contains one integer n (1 ≤ n ≤ 5000).

The second line contains n integers a_1, a_2, ..., a_n (0 ≤ a_i ≤ 10^9).

Output

Print one integer — the minimum number of operations required to delete all elements from the multiset.

Examples

Input


4
1 4 1 1


Output


2


Input


5
1 0 1 0 1


Output


3
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;

public class Main {

    public static void main(String[] args) {

        Parser parser = new Parser();
        int t = 1;
        for (int i = 1; i <= t; i++) {
            Problem problem = new Problem();
            problem.solve(i);
        }
    }
}

class Problem {
    int n;
    int[] a;
    Parser parser = new Parser();

    long get(int l, int r) {
        if(l == r) {
            return 0;
        }

        int index = l;
        long minV = a[l];
        for(int i = l; i < r; i++) {
            if(a[i] < minV) {
                minV = a[i];
                index = i;
            }
        }
        for(int i = l; i < r; i++) {
            a[i] -= minV;
        }
        return Math.min(r - l, minV + get(l, index) + get(index + 1, r));
    }

    public void solve(int testNum) {
        n = parser.parseInt();

        a = new int[n];
        for(int i = 0; i < n; i++) {
            a[i] = parser.parseInt();
        }
        System.out.println(get(0, n));
    }
}

class MathUtil {

    public static long gcd(long a, long b) {
        return b == 0 ? a : gcd(b, a % b);
    }

    public static long pow(long x, long y) {
        return pow(x, y, Function.identity());
    }

    public static long pow(long x, long y, long mod) {
        return pow(x, y, v -> v % mod);
    }

    private static long pow(long x, long y, Function<Long, Long> action) {
        long res = 1;
        long t = x;
        while (y > 0) {
            if ((y & 1) == 1) {
                res += t;
                res = action.apply(res);
            }
            t *= t;
            t = action.apply(t);
            y /= 2;
        }
        return res;
    }
}

class DisjointSet {

    private final int[] f;

    public DisjointSet(int size) {
        f = new int[size + 1];
        for (int i = 0; i <= size; i++) {
            f[i] = i;
        }
    }

    public int find(int u) {
        if (f[u] == u) return u;
        return f[u] = find(f[u]);
    }

    public boolean merge(int u, int v) {
        u = find(u);
        v = find(v);
        if (u == v) return false;
        if (u > v) {
            int t = u;
            u = v;
            v = t;
        }
        f[u] = v;
        return true;
    }
}

class Parser {
    private static final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    private StringTokenizer tokenizer;

    void fill() {
        while (tokenizer == null || !tokenizer.hasMoreElements()) {
            try {
                tokenizer = new StringTokenizer(reader.readLine());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    int parseInt() {
        fill();
        return Integer.parseInt(tokenizer.nextToken());
    }

    long parseLong() {
        fill();
        return Long.parseLong(tokenizer.nextToken());
    }

    double parseDouble() {
        fill();
        return Double.parseDouble(tokenizer.nextToken());
    }

    String parseString() {
        fill();
        return tokenizer.nextToken();
    }
}