求数组的子数组之和的最大值IV

在之前的基础上又安排了二维数组的,在课上一开始是理解错要求了,简单的以为用循环数组就能解决,但是却忽视了子数组是否能构成矩形,之后课下和同学们讨论,主要是多重遍历,但是我还是没搞明白怎么构成新的二维数组,之后同学给了一段源代码,自己还在摸索:

  1 package b;
  2 
  3 import java.util.Scanner;
  4 
  5 import javax.print.attribute.standard.PrinterLocation;
  6 
  7 public class b 
  8 {
  9     public static void main(String[] args)
 10     {
 11         Scanner scanner=new Scanner(System.in);
 12         System.out.println("请输入二维数组的行和列:");
 13         int hang=scanner.nextInt();
 14         int lie=scanner.nextInt();
 15         System.out.println("请输入二维数组:");
 16         int[][] shuzu=new int[hang][lie];
 17         
 18         int i,j;
 19         for(i=0;i<hang;i++)
 20         {
 21             for(j=0;j<lie;j++)
 22             {
 23                 shuzu[i][j]=scanner.nextInt();
 24             }
 25         }
 26         
 27         System.out.println("此数组中连续和的最大值为:"+max(shuzu,hang,lie));
 28      
 29     }
 30     
 31     static int max(int shuzu[][],int hang,int lie)
 32     {
 33         int max=0,sum=0;
 34         int i,j;
 35         int[] b=new int[lie];
 36         int[] up=new int[hang];
 37         int[] down=new int[hang];
 38         int[] t=new int[hang];
 39         if(lie==1)
 40         {
 41             for (i=0;i<hang;i++) 
 42             {
 43                 sum+=shuzu[i][0];
 44                 if(sum<0) 
 45                 {
 46                     sum=0;
 47                 }
 48                 if(sum>max)
 49                 {
 50                     max=sum;
 51                 }
 52             }
 53 
 54            if(max==0) 
 55            {
 56                for(i=0;i<hang;i++) 
 57                {
 58                    if(i==0) 
 59                    {
 60                        max=shuzu[i][0];
 61                    }
 62                    if(shuzu[i][0]>max) 
 63                    {
 64                        max=shuzu[i][0];
 65                    }
 66                }
 67             }
 68         }
 69         else
 70         {
 71             for(i=0;i<hang;i++)
 72             {
 73                 for(j=0;j<lie;j++)
 74                 {
 75                     b[j]=shuzu[i][j];
 76                 }
 77                 int[] c=new int[100];
 78                 c[0]=0;
 79                 int sum1=0,max1=0,k;
 80                 for(k=0;k<lie;k++)
 81                 {
 82                     if(sum1<0)
 83                     {
 84                         sum1=b[k];
 85                     }
 86                     else
 87                     {
 88                         sum1=sum1+b[k];
 89                     }
 90                     c[k]=sum1;
 91                 }
 92                 max1=c[0];
 93                 int mmark=0,smark=0;
 94                 for(k=0;k<lie;k++)
 95                 {
 96                     if (max1<c[k])
 97                     {
 98                         max1= c[k];
 99                         mmark = k;
100                     }
101                 }
102                 for (k = mmark;k >= 0;k--)
103                 {
104                     if (c[k] == b[k])
105                     {
106                         smark = k;
107                         break;
108                     }
109                 }
110                 sum=max1;
111                 
112                 up[i]=smark;                                  
113                 down[i]=mmark;
114                 t[i]=sum;
115      
116             }
117             int t2=t[0];
118             for(i=0;i<hang-1;i++)
119             {
120                 if(up[i]<=down[i+1] && down[i]>=up[i+1])
121                 {
122                     t2+=t[i+1];
123                 }
124                 for(j=up[i];j<up[i+1];j++)
125                 {
126                     if(shuzu[i+1][j]>0) t2+=shuzu[i+1][j];                   //判别独立正数
127                 }
128      
129             }
130             max=t2;
131         }
132         return max;
133     }
134 }

 

posted @ 2019-03-24 21:55  枫黎  阅读(191)  评论(0编辑  收藏  举报