Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)——Ddp——Bear and Blocks
http://codeforces.com/contest/574/problem/D
/* 容易得到状态方程 dp[i] = min(a[i], dp[i-1]+1,dp[i-2]+2 ....dp[i+1]+1,,,) 那么可以得到两个递推式 dp[i] = min(a[i], 之间的min+1) dp[i] = min(a[i], dp[i], 之后的min+1) */ /************************************************ * Author :Powatr * Created Time :2015-8-31 15:28:14 * File Name :cfD.cpp ************************************************/ #include <cstdio> #include <algorithm> #include <iostream> #include <sstream> #include <cstring> #include <cmath> #include <string> #include <vector> #include <queue> #include <deque> #include <stack> #include <list> #include <map> #include <set> #include <bitset> #include <cstdlib> #include <ctime> using namespace std; #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 typedef long long ll; const int MAXN = 1e5 + 10; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; int res[MAXN]; int a[MAXN]; int main(){ int n; while(~scanf("%d", &n)){ for(int i = 1; i <= n; i++){ scanf("%d", &a[i]); res[i] = a[i]; } int now = 0; int pre = 0; for(int i = 1; i <= n; i++){ now = pre + 1; pre = res[i] = min(res[i], now); } pre = 0; for(int i = n; i >= 1; i--){ now = pre + 1; pre = res[i] = min(res[i], now); } int max1 = -1; for(int i = 1; i <= n; i++) max1 = max(max1, res[i]); printf("%d\n", max1); } return 0; }