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;
}
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号