码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #318-(D. Bear and Blocks)

时间:2015-08-30 23:14:26      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:dp   codeforces   

这道题我上来就是想到的是暴力,每次都把表面的那一层减掉,直到所有的高度为0为止。但是T了。

题意:

现在有n个方格,然后每个方格都有一个高度,然后每次都可以把那些非完整块(就是它的四个方向没有被完全包围)给连在一起消去。问你最后把所有的方块消去需要几次。

思路:

我们只需要从左边,右边分别进行一次消去,然后最后进行一次判断就好了。最多的次数不可能超过最大的那个的高度。

首先初始化为h1[0]=0,h2[n+1]=0, 我们设两个数组h1代表的是从左边开始消去每次的最大高度,h2则是右边的。

h1[i]=min(h[i],h1[i-1]+1);    

h2[i]=min(h[i],h2[i+1]+1);

这两个方程应该想一下就能明白的。我们每次当然应该满足高度较小的那个。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<vector>
using namespace std;
#define inf 99999999
#define maxn 100010
int h[maxn];
int h1[maxn],h2[maxn];
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&h[i]);
	int ans=0;
	h1[0]=0;
	for(int i=1;i<=n;i++){
		h1[i]=min(h[i],h1[i-1]+1);
	}
	h2[n+1]=0;
	for(int i=n;i>=1;i--){
		h2[i]=min(h[i],h2[i+1]+1);
	}
	for(int i=1;i<=n;i++){
		ans=max(ans,min(h1[i],h2[i]));
	}
	printf("%d\n",ans);
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces Round #318-(D. Bear and Blocks)

标签:dp   codeforces   

原文地址:http://blog.csdn.net/acmer_hades/article/details/48110177

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!