题目链接:http://codeforces.com/problemset/problem/573/B
题 意:给你一个图形,每次都将最外层消除,问最多要几次才能全部消除。
思 路:经过观察发现,每一列要么减1,要么等于min(vis[i-1],vis[i+1]),所以可以由左右的列的操作数找出本列的操作数。因此可以用dp的思想从前往后,在从后往前递推两次。
代码如下:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <stack>
using namespace std;
typedef __int64 LL;
LL vis[100005] = {0};
int main()
{
LL n;
while( scanf ( "%I64d", &n ) != EOF )
{
LL ans = 0;
vis[0] = 0;
for( int i = 1; i <= n; i ++ )
scanf ( "%I64d", &vis[i] );
vis[1] = 1;//每一个图形的第一列的操作数为1
for( int i = 2; i <= n; i ++ )
vis[i] = min( vis[i], vis[i-1]+1 );
vis[n] = 1;//每一个图形的最后一列的操作数为1
for( int i = n-1; i > 0; i -- )
vis[i] = min( vis[i], vis[i+1]+1 );
for( int i = 1; i <= n; i ++ )
ans = max( ans, vis[i] );//整个图形的操作数为操作次数最多的一列的值
printf( "%I64d\n", ans );
}
return 0;
}