POJ - 2029 (二维树状数组)

http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=13384

题意:给一个n*m的矩阵,里面有些小矩阵有树,再给一个范围,要你求在它所给定的范围内,最多可以有多少颗树?

思路:二维树状数组..........

反思:一开始,我是对于矩阵给出的范围直接处理的,结果错了.........

#include<iostream>
using namespace std;
int s[105][105],c[105][105];
int lowbit(int x)
{
	return x&(-x);
}
void updata(int x,int y,int v)
{
	int i,j;
	for(i=x;i<105;i+=lowbit(i))
	{
		for(j=y;j<105;j+=lowbit(j))
		{

			c[i][j]+=v;
		}
	}
}
int getsum(int x,int y)
{
	int i,j,sum=0;
	for(i=x;i>0;i-=lowbit(i))
	{
		for(j=y;j>0;j-=lowbit(j))
		{
			sum+=c[i][j];
		}
	}
	return sum;
}
int main()
{
	int t;

	while(scanf("%d",&t)>0&&t)
	{
		memset(c,0,sizeof(c));
		memset(s,0,sizeof(s));
		int n,m;
		scanf("%d%d",&n,&m);
		int i,j;
		for(i=1;i<=t;i++)
		{
			int tmp1,tmp2;
			scanf("%d%d",&tmp1,&tmp2);
			updata(tmp1,tmp2,1);
		}
		
		for(i=1;i<=n;i++)
			for(j=1;j<=m;j++)
				s[i][j]=getsum(i,j);
		int a,b,max=0,k;
		scanf("%d%d",&a,&b);                  //注意:a,b是给出的小矩阵的范围,此题要对其进行-1处理,因为要是a==3,b==4,原意是要计算
		a--;                                //行为3,列为4的小矩阵内最多可以有多少课树,如果不-1,则会变成行为4,列为5的小矩阵
		b--;                          //内最多有多少棵树.............
		for(i=1;i+a<=n;i++)
			for(j=1;j+b<=m;j++)
			{
				k=s[i+a][j+b]-s[i-1][j+b]-s[i+a][j-1]+s[i-1][j-1];
				if(max<k)
					max=k;
			}
		printf("%d\n",max);
	}
	return 0;
}

 

posted @ 2012-12-29 20:34  紫忆  阅读(217)  评论(0编辑  收藏  举报