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 }

你可能感兴趣的:(HDU)