求最大子矩阵的和:实现代码如下
package com.threeTop.www;
public class MaxSumMatrix {
/**
* 获取矩阵的最大和子矩阵
* @param matrix
* @return
*/
public static int maxSumSubMatrix(int [][]matrix)
{
int[][]total=matrix;
for(int i=1;i<matrix.length;i++)
{
for(int j=0;j<matrix[0].length;j++)
{
total[i][j]+=total[i-1][j];
}
}
int maximum=Integer.MIN_VALUE;
for(int i=0;i<matrix.length;i++)
{
for(int j=i;j<matrix.length;j++)
{
//result 保存的是从第i行到j行素有元素值得和
int []result=new int[matrix[0].length];
for(int k=0;k<matrix[0].length;k++)
{
if(i==0)
{
result[k]=total[j][k];
}else
{
result[k]=total[j][k]-total[i-1][k];
}
}
//调用求取子数组和最大函数
int maximal=maxSubArray(result);
if(maximal>maximum)
{
maximum=maximal;
}
}
}
return maximum;
}
/**
* 动态规划求最大子数组
* @param result
* @return
*/
private static int maxSubArray(int[] result) {
int lastSum=0;
int Maxsum=result[0];
for(int i=0;i<result.length;i++)
{
if(lastSum>0)
{
//累加
lastSum=lastSum+result[i];
}else
{
//如果需要新的起点,则重新赋值start
lastSum=result[i];
}
if(Maxsum<lastSum)
{
Maxsum=lastSum;
}
}
return Maxsum;
}
public static void main(String[]args)
{
int [][]matrix={{-1,2,-1,3,-4},{2,3,4,-5,1},{1,-1,5,-3,-2}};
System.out.println("最大子矩阵和为:");
System.out.println(MaxSumMatrix.maxSumSubMatrix(matrix));
}
}