#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define rep(i, N) for (int i = 0; i < N; i++) #define pb push_back typedef long long ll; typedef unsigned long long ull; typedef pair i_i; typedef pair ll_i; typedef pair i_ll; typedef pair d_i; typedef pair ll_ll; typedef pair d_d; struct edge { int v; ll w; }; const int MOD = 1000000007; const int _MOD = 1000000009; double EPS = 1e-10; const int INF = INT_MAX / 10; int main() { int N; cin >> N; vector a(N); rep(i, N) cin >> a[i]; if (N == 1) { cout << a[0] << endl; return 0; } int lb = -1, ub = 1010000000; while (ub - lb > 1) { int mid = (lb + ub) / 2; vector > dpl(N + 1, vector(N + 1, INF)), dpr = dpl; rep(i, N) dpl[i][i + 1] = dpr[i][i + 1] = 0; bool ok = false; for (int d = 1; d <= N; d++) for (int l = 0; l + d <= N; l++) { int r = l + d; if (mid - dpl[l][r] >= a[l]) { if (d == N) ok = true; if (l - 1 >= 0) dpl[l - 1][r] = min(dpl[l - 1][r], dpl[l][r] + 1); if (r + 1 <= N) dpr[l][r + 1] = min(dpr[l][r + 1], dpl[l][r] + r - l); } if (mid - dpr[l][r] >= a[r - 1]) { if (d == N) ok = true; if (l - 1 >= 0) dpl[l - 1][r] = min(dpl[l - 1][r], dpr[l][r] + r - l); if (r + 1 <= N) dpr[l][r + 1] = min(dpr[l][r + 1], dpr[l][r] + 1); } } if (ok) ub = mid; else lb = mid; } cout << ub << endl; }