求一个二维数组的最大子矩阵
今天所做的小程序是接着上次的一位数组的最大子数组,上次运用了两种方法对一位数组进行求最大子数组,分别是:穷举法和动态规划的方法。今天是对二维数组进行求解,可以在考虑一种利用上次的动态规划,试着将二维数组转化为一位数组进行求解,对二位数组暂时想到的是穷举法:
我们想,如果确定了选择第i列和第j列之间的元素,那么在这个范围内,其实就是一个最大子序列问题:
程序代码:
package com.su.test; public class Hellosu { public static void main(String[] args) { //测试用例 int b[][]={{3,4,-7},{7,2,0},{-11,3,0}}; int max=maxSubMatrix(b,b.length,b[0].length); System.out.println(max); } public static int maxSubArray(int ar[],int n) //一维数组最大子数组 { int max=ar[0]; int k[]=new int[3]; int b=ar[0]; int i; for(i=1;i<n;i++) { if(b>0) { b+=ar[i]; } else { b=ar[i]; } if(b>max) { max=b; } } return max; } public static int maxSubMatrix(int p[][],int m,int n) //二维数组最大子矩阵 { int i,j,k,max=p[0][0],tempt; //记录每行的和 int last_i=0,last_j=0; int sum[]=new int[m]; for(i=0;i<n;i++) { for(k=0;k<m;k++) sum[k]=0; for(j=i;j<n;j++) { for(k=0;k<m;k++) { sum[k]+=p[k][j]; } tempt=maxSubArray(sum,m); if(tempt>max) { last_i=i; last_j=j; max=tempt; } } } System.out.println("从第"+(last_i+1)+"列开始,到第"+(last_j+1)+"结束"); return max; } }
运行结果截图: