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


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

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

      运行结果截图:

        

  • 相关阅读:
    【SpringCloud】工程分类概况
    【Spring Alibaba】Sentinel/Nacos/RocketMQ/Seata/
    【Eureka】服务架构类知识点
    求车速
    尼科彻斯定理
    Tom数
    弟弟的作业
    汽水瓶
    POJ-2533-Longest Ordered Subsequence(LIS模板)
    HDU-1331-Function Run Fun(动态规划3)
  • 原文地址:https://www.cnblogs.com/sulindong/p/3607523.html
Copyright © 2020-2023  润新知