Chinaunix首页 | 论坛 | 博客
  • 博客访问: 349277
  • 博文数量: 63
  • 博客积分: 1412
  • 博客等级: 中尉
  • 技术积分: 648
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-10 23:07
文章分类

全部博文(63)

文章存档

2012年(42)

2011年(21)

我的朋友

分类: C/C++

2011-03-12 23:56:42

原题链接如下:
这题的方法和2479题类似,也是利用”求最大连续字段的和“的方法

假设最大子矩阵的结果为从第r行到k行、从第i列到j列的子矩阵,如下所示(ari表示a[r][i],假设数组下标从1开始): 
| a11......a1i......a1j......a1n | 
| a21......a2i......a2j......a2n | 
| ........................................| 
| ar1......ari......arj......arn....| 
| ........................................| 
| ak1......aki......akj......akn..| 
| ........................................| 
| an1......ani......anj......ann | 

那么我们将从第r行到第k行的每一行中相同列的加起来,可以得到一个一维数组如下: (ar1+……+ak1, ar2+……+ak2, ……,arn+……+akn) 由此我们可以看出最后所求的就是此一维数组的最大子段和问题,到此我们已经将问题转化为上面的已经解决了的问题了。

解题如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define MAXNUM 120

  5. int    get_max_value( int *data, int n );

  6. int    data[MAXNUM][MAXNUM];

  7. int    main()
  8. {
  9.     int    N = 0;
  10.     int    i, j;
  11.     scanf( "%d", &N );   //N表示N×N的数组
  12.     
  13.     //get input data
  14.     get_data( N );
  15.     
  16.     //get the result
  17.     op_data( N );
  18.     
  19.     return 0;
  20. }

  21. int    get_data( N )
  22. {
  23.     int    i, j;
  24.     for( i=0; i<N; i++ )
  25.     {
  26.         for( j=0; j<N; j++ )
  27.         {
  28.             scanf( "%d", &data[i][j] );
  29.         }
  30.     }

  31.     return 0;
  32. }

  33. //按照上面的方法求最大和子矩阵
  34. int    op_data( int N )
  35. {
  36.     int    tmp[MAXNUM];
  37.     int i, j, k, l, max, value ;

  38.     max = data[0][0];
  39.     
  40.     for( i=0; i<N; i++ )
  41.     {
  42.         memset( tmp, 0x00, sizeof(tmp) );
  43.         for( j=i; j<N; j++ )
  44.         {
  45.     //tmp[]数组用于存储从第i行到第j行的相应列元素的和
  46.     //例如tmp[1]=data[1][1]+[data[2][1]+data[3][1]+......
  47.             for( k=0; k<N; k++ )
  48.             {
  49.                 tmp[k] += data[j][k];
  50.             }      
  51.             
  52.             value = get_max_value( tmp, N );

  53.             if( value > max )
  54.             {
  55.                 max = value;
  56.             }
  57.         }
  58.     }
  59.     
  60.     printf( "%d\n", max );

  61.     return 0;
  62. }

  63. int    get_max_value( int *data, int n )
  64. {
  65.     int    i;
  66.     int    value, max;
  67.     value = max = data[0];
  68.     
  69.     for( i=1; i<n; i++ )
  70.     {
  71.         if( value > 0 )
  72.         {
  73.             value += data[i];
  74.         }
  75.         else
  76.         {
  77.             value = data[i];
  78.         }
  79.     
  80.         if( value > max )
  81.         {
  82.             max = value;
  83.         }
  84.     }
  85.     
  86.     return max;
  87. }


阅读(2066) | 评论(0) | 转发(0) |
0

上一篇:北大2479题

下一篇:转载pku 2263

给主人留下些什么吧!~~