POJ 2029 Get Many Persimmon Trees(DP)
和求最大子矩阵和,神似。。。宝哥用树状数组做的,数据量挺小的,我直接暴力O(n^2)水过了。。
1 #include <stdio.h> 2 #include <string.h> 3 int p[101][101],o[101][101],map[101][101],key[101][101]; 4 int main() 5 { 6 int i,j,x,y,n,m,nu,r,c,max; 7 while(scanf("%d",&nu)!=EOF) 8 { 9 if(!nu) break; 10 memset(p,0,sizeof(p)); 11 memset(o,0,sizeof(o)); 12 memset(map,0,sizeof(map)); 13 memset(key,0,sizeof(key)); 14 scanf("%d%d",&n,&m); 15 for(i = 1;i <= nu;i ++) 16 { 17 scanf("%d%d",&x,&y); 18 p[x][y] = 1; 19 } 20 scanf("%d%d",&r,&c); 21 for(i = 1;i <= n;i ++) 22 { 23 for(j = 1;j <= m;j ++) 24 { 25 o[i][j] = o[i][j-1]+p[i][j]; 26 } 27 } 28 for(i = 1;i <= n;i ++) 29 { 30 for(j = 1;j <= m;j ++) 31 { 32 map[i][j] = map[i-1][j]+o[i][j]; 33 } 34 } 35 for(i = 1;i <= n;i ++) 36 { 37 for(j = 1;j <= m;j ++) 38 { 39 if(i-r>=0&&j-c>=0) 40 { 41 key[i][j] = map[i][j]+map[i-r][j-c]-map[i-r][j]-map[i][j-c]; 42 } 43 } 44 } 45 max = 0; 46 for(i = 1;i <= n;i ++) 47 { 48 for(j = 1;j <= m;j ++) 49 { 50 if(max < key[i][j]) 51 max = key[i][j]; 52 } 53 } 54 printf("%d\n",max); 55 } 56 return 0; 57 }