求最大子矩阵
例如在 0 -2 -7 0 这样一个4*4的矩阵中,元素之和最大的子矩阵为 9 2 ,它们之和为15;
9 2 -6 2 -4 1
-4 1 -4 1 -1 8
-1 8 0 -2
将此二维数组转化为一维数组,就变成了求和最大的子序列问题了;
看下图大家应该就明白了;
public class Max {
public static void main(String[] args){
int[][]array={{0,-2,-7,0},{9,2,-6,2},{-4,1,-4,1},{-1,8,0,-2}};
System.out.println(reSon(array,4));
}
public static void clear(int[] array){
for (int i=0;i<array.length;i++)
array[i]=0;
}
public static int reMAx(int[]array,int n){//在一维数组中找出和最大的子序列
int i,max=array[0],now=0;//初始化max=array[0],避免出现数组中的元素都是负数
for(i=0;i<n;i++)
{
if(now > 0)
now += array[i];//若前面一段元素之和则直接加上当前元素
else
now = array[i];//否则now直接等于当前元素
if(now > max)
max = now;//比较大小
}
return max;
}
public static int reSon(int[][]array,int n){
int max=0;//保存当前循环情况中的的最大值
int finalMax=0;//保存所有情况中的最大值
int[] array1=new int[n];
for(int i=0;i<n;i++){
clear(array1);//数组初始化为0
for(int j=i;j<n;j++) {
for (int k = 0; k < n; k++)
array1[k] += array[j][k];//将二维数组转化为一维数组
max=reMAx(array1,n);//获取和最大的子序列
if(max>finalMax)
finalMax=max;
}
}
return finalMax;
}
}