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 }
posted @ 2012-07-25 16:06  Naix_x  阅读(164)  评论(0编辑  收藏  举报