hello kity

期待您的批阅,由于写解题报告时 不一定考虑的很周到,所以如果您有什么不懂的地方,请您留言,然而一天之内我肯定会看见您信息,再对代码注释详细,让您更好的阅读

分类

最新评论

最新留言

链接

RSS

计数器
224364

功能

POJ 2029(Get Many Persimmon Trees)
spoiler
posted @ 2011年4月11日 19:29
in 树状数组经典题目
, 1838 阅读
题目大意:一个H * W的大矩形,里面的某些格子种有树。现在要你找出一个h * w的小矩形,使得里面树的数量最多,问最多有多少棵树
题目分析:就是求二维的矩形和,然后枚举各个满足条件矩形和的最大值。
源程序+部分注释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include<iostream> #include<stdio.h> #include<string.h> #define lowbit(x) (x&(-x)) using namespace std; int w,h; int c[120][120]; int getsum( int x, int y){ int i=x,j,sum=0; while (i){ j=y; while (j){ sum+=c[i][j]; j-=lowbit(j); } i-=lowbit(i); } return sum; } int modify( int x, int y){ int k; while (x<=w){ k=y; while (k<=h){ c[x][k]+=1; k+=lowbit(k); } x+=lowbit(x); } return 0; } int count_sum( int x, int y, int xm, int ym){ int sum=0; sum=getsum(x,y)-getsum(x-xm,y)-getsum(x,y-ym)+getsum(x-xm,y-ym); return sum; } int main(){ int n,s,t; int i,j,x,y,max,ans; while ( scanf ( "%d" ,&n),n){ memset (c,0, sizeof (c)); max=0; scanf ( "%d %d" ,&w,&h); for (i=1;i<=n;i++){ scanf ( "%d %d" ,&x,&y); modify(x,y); } scanf ( "%d %d" ,&s,&t); for (i=s;i<=w;i++) for (j=t;j<=h;j++){ ans=count_sum(i,j,s,t); if (max<ans) max=ans; } cout<<max<<endl; } return 0; } |