最大子矩阵的和
***定义:***就是不限定子矩阵的行和列,只要求和最大。
例如a[3][3]=
1 2 3
0 7 -1
1 -2 0
的max=a[0][0]+a[0][1]+a[0][2]+a[1][0]+a[1][1]+a[1][2]=12;
***基本思路:***假设最大子矩阵的行数为i,(i从1到n),分别求出1-i,2-(i+1),3-(i+2),…(n-i+1)-(n)行所对应列的和,对所得结果的每一个数组求最大子段和,这些和中的最大值就是最大子矩阵之和。
举例:
a[3][3]=
1 2 3
0 7 -1
1 -2 0
假设最大子矩阵为1行,i=1,则不需要计算对应列的和,直接就a[0][],a[1][],a[2][]的最大字段和,分别为6,7,1,此时max=7;i=2,即最大子矩阵为2行,分别求出1-i,2-(i+1),3-(i+2),…(n-i+1)-(n)行所对应列的和,第1行+第2行=(1,9,2),第2行+第3行=(1,5,-1),在求所得一维矩阵的最大子段和分别为12和6,此时更新max=12;i=3,即最大子矩阵为3行,此时第1行+第2行+第3行=(2,7,2),该数组的最大字段和为11,此时max不更新,仍为12.
代码
#include
using namespace std;
#define m 3
#define n 3
//求一维数字最大子段和函数
int linemaxsum(int a[],int y)
{
int sum=0;
int b=0;
for(int i=0;i<y;i++)
{
if(b>0) b+=a[i];
else
b=a[i];
if(b>sum) sum=b;
}
return sum;
}
//求二维数组最大子矩阵函数
int matrixmax(int a[
c++之最大子矩阵的和
最新推荐文章于 2025-06-30 01:13:37 发布