题目描述:给定一个m行n列的整数矩阵A,试求A的一个子矩阵,使其各元素之和为最大。
方法:借助一维数组连续子序列最大和的方法,将二维数组求最大子矩阵和的问题转化为求一维数组连续子序列最大和。
矩阵形式如下:
int [][]data = {{4,-2,9},
{-1,3,8},
{-6,7,6},
{0,9,-5}};
//一维数组连续子序列最大和
public int maxSum(int []data,int n)
{
int []b=new int [data.length];
b[0]=data[0];//第一个为他自己,因前边没有数,不能放入递推公式中;
int maxsum=b[0];
for(int i=0;i<n-1;i++)
{
if(b[i]<=0)
{
b[i+1]=data[i+1];
}
else
{
b[i+1]=b[i]+data[i+1];
}
if(b[i+1]>maxsum)
maxsum=b[i+1];
}
return maxsum;
}
//求子矩阵最大和例程;
public int maxMatrixSum(int[][]matrix)
{
int rows=matrix.length;//nums of rows;
int cols=matrix[0].length;//nums of cols;
int sum=0;//maxsum tobe returned;
int []b=new int [cols];//用来存放首行与末行之间每列的元素的和,转化为一维子序列和情况;
for(int rowbegin=0;rowbegin<rows;rowbegin++ )
{
//每次循环到起始行变化时,把b内元素全部清0;
for(int i=0;i<b.length;i++)
{
b[i]=0;
}
//枚举各种行情况;
for(int rowend=rowbegin;rowend<rows;rowend++)
{
for(int col=0;col<cols;col++)
{
b[col]+=matrix[rowend][col];//b每次只更新一行元素
}
//然后把b数组当成连续子序列求最大和;
if(maxSum(b,b.length)>sum)
{
sum=maxSum(b,b.length);
}
}
}
return sum;
}