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