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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值