HDU 1559 最大子矩阵 (二维DP)
和以前HDU1081很类似。1081有两种做法,一种是直接压缩成一维,一种是利用矩形内部加减。这个题,只能用后者吧,反正我用的后边一种方法。
1 #include <stdio.h> 2 #include <string.h> 3 __int64 p[1000][1000],o[1000][1000],sum[1000][1000]; 4 int main() 5 { 6 int i,j,m,n,t,x,y; 7 __int64 max; 8 scanf("%d",&t); 9 while(t--) 10 { 11 memset(p,0,sizeof(p)); 12 memset(o,0,sizeof(o)); 13 memset(sum,0,sizeof(sum)); 14 scanf("%d%d%d%d",&m,&n,&x,&y); 15 for(i = 1; i <= m; i ++) 16 for(j = 1; j <= n; j ++) 17 { 18 scanf("%I64d",&p[i][j]); 19 } 20 for(i = 1; i <= m; i ++) 21 { 22 for(j = 1; j <= n; j ++) 23 { 24 if(j == 1) 25 o[i][j] = p[i][j]; 26 else 27 o[i][j] += p[i][j] + o[i][j-1]; 28 } 29 } 30 for(i = 1; i <= m; i ++) 31 { 32 for(j = 1; j <= n; j ++) 33 { 34 if(i == 1) 35 sum[i][j] = o[i][j]; 36 else 37 sum[i][j] = o[i][j] + sum[i-1][j]; 38 } 39 } 40 /*for(i = 1; i <= m; i ++) 41 { 42 for(j = 1; j <= n; j ++) 43 { 44 printf("%I64d ",sum[i][j]); 45 } 46 printf("\n"); 47 }*/ 48 max = 0; 49 for(i = x; i <= m; i ++) 50 for(j = y; j <= n; j ++) 51 { 52 if(max < sum[i][j] - sum[i-x][j] - sum[i][j-y] + sum[i-x][j-y]) 53 max = sum[i][j] - sum[i-x][j] - sum[i][j-y] + sum[i-x][j-y]; 54 } 55 printf("%I64d\n",max); 56 } 57 return 0; 58 }