求一个二维数组的最大子矩阵

     今天所做的小程序是接着上次的一位数组的最大子数组,上次运用了两种方法对一位数组进行求最大子数组,分别是:穷举法和动态规划的方法。今天是对二维数组进行求解,可以在考虑一种利用上次的动态规划,试着将二维数组转化为一位数组进行求解,对二位数组暂时想到的是穷举法:

     我们想,如果确定了选择第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;
	}
 }

  运行结果截图:

    

原文地址:https://www.cnblogs.com/sulindong/p/3607523.html