题目简要:
描述
比如,如下4 * 4的矩阵
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
的最大子矩阵是
9 2
-4 1
-1 8
这个子矩阵的大小是15。
4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
15
解题思路:
这道也是上课讲过的题,思路就是将求最大子矩阵转化成求最大子段的问题。
附代码:
#include
<bits/stdc++.h>
using namespace std ;
int main ()
{
int b [ 102 ],i ,j ,k ,n ,t ,Max ,c ,sum = 0 ;
int a [ 102 ][ 102 ];
cin >>n ;
for (i = 1 ;i <=n ;i ++)
for (j = 1 ;j <=n ;j ++) cin >>a [i ][j ];
for (i = 1 ;i <=n ;i ++)
{
memset (b , 0 , sizeof (b ));
for (j =i ;j <=n ;j ++)
{
for (k = 1 ;k <=n ;k ++)
b [k ]=b [k ]+a [j ][k ];
c = 0 ,Max = 0 ;
for (t = 1 ;t <=n ;t ++)
{
if (c > 0 )
c =c +b [t ];
else
c =b [t ];
if (c >Max )
Max =c ;
}
if (sum <Max )
sum =Max ;
}
}
cout <<sum <<endl ;
return 0 ;
}
using namespace std ;
int main ()
{
int b [ 102 ],i ,j ,k ,n ,t ,Max ,c ,sum = 0 ;
int a [ 102 ][ 102 ];
cin >>n ;
for (i = 1 ;i <=n ;i ++)
for (j = 1 ;j <=n ;j ++) cin >>a [i ][j ];
for (i = 1 ;i <=n ;i ++)
{
memset (b , 0 , sizeof (b ));
for (j =i ;j <=n ;j ++)
{
for (k = 1 ;k <=n ;k ++)
b [k ]=b [k ]+a [j ][k ];
c = 0 ,Max = 0 ;
for (t = 1 ;t <=n ;t ++)
{
if (c > 0 )
c =c +b [t ];
else
c =b [t ];
if (c >Max )
Max =c ;
}
if (sum <Max )
sum =Max ;
}
}
cout <<sum <<endl ;
return 0 ;
}
解题感受:
其实这道题至今我都还没有完完全全明白,我还专门让程序把每个数都输出看了。另外,我也从网上查了一下,看了看别人的代码。