二维数组最大值

组队结合:张泽敏,宋家林

设计思路:将一个二维数组中的非负数块分出来,一次标上记号,在一次求这些模块的最短权值路径,以和最大的模块为基础,看加上其他模块相对最小路径权值来说是否值得(和是否大于0),值得便加上,否则不加,最后遍历完这些模块之后,便可以得到最大联通子数组

组合过程:一起讨论思路,把数学问题转化,再想想怎么用Java来实现。碰到的问题不少,小组合作两个人集合起来,思路就很多。

import java.util.Scanner;
public class main {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
         
             int a[][]=new int[20][20];
             Scanner str=new Scanner(System.in);
             System.out.print("请输入二维数组的行数列数:");
             int index=str.nextInt();
             int length=str.nextInt();
              
             int y=0;
             System.out.println("请输入数组:");
             for(int i=0;i<index;i++)
             {
                 for(int j=0;j<length;j++)
                 {
                    a[i][j]=str.nextInt();
                 }
             }
             int s=sum(a,length,index);
             System.out.println("最大连通子数组和:"+s);
    }
    public static int max2(int arry[],int length)
    {
            int total=0;
            int sum=arry[0];
            int minsum=arry[0];
            for(int i=1;i<length;i++)
            {
                if(sum>0)
                {
                    sum=arry[i];
                }
                else
                {
                    sum=sum+arry[i];
 
                }
                if(minsum>=sum)
                {
                    minsum=sum;
                }
                total=total+arry[i];
            }
            total=total+arry[0];
            minsum=total-minsum;
 
            return minsum;
    }
    public static int max1(int arry[],int length)  
    {
            int sum=arry[0];
            int maxsum=arry[0];
            for(int i=1;i<length;i++)    
            {
                if(sum<0)
                {
                    sum=arry[i];
                }
                else
                {
                    sum=sum+arry[i];
 
                }
                if(maxsum<=sum)
                {
                    maxsum=sum;
                }
            }
            return maxsum;
    }
    public static int sum(int a[][],int length,int num1)
    {   
          int y=0;
          int d[]=new int[20];
          int e[]=new int[100];
          int c[][]=new int[100][20];
          c[0][0]=0;
          int p=0;
          int[] b=new int[100];
          b[0]=0;
          for(int j=0;j<num1;j++)
          {
              for(int t=j;t<num1;t++)
              {
                  for(int i=0;i<length;i++)
                  {
                      b[i]=b[i]+a[t][i];
                      c[p][i]=b[i];
                  }
                  p=p+1;
              }
              for(int o=0;o<100;o++)
              {
                  b[o]=0;
              }
          }
          for(int l=0;l<p;l++)
          {
 
              for(int u=0;u<length;u++)
              {
                  d[u]=c[l][u];
              }
              e[y++]=max1(d,length);
              e[y++]=max2(d,length);
 
          }
          int Max=e[0];
          for(int i=0;i<y;i++)
          {
 
              if(e[i]>=Max)
             {
                 Max=e[i];
             }
          }
        return Max;
    }
     
     
}

  

 

posted @ 2017-04-07 18:51  20153143  阅读(134)  评论(0编辑  收藏  举报