首页 > 代码库 > 返回一个二维整数数组中最大联通子数组的和

返回一个二维整数数组中最大联通子数组的和

  程序设计思路:首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组。再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标。这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到;第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价。最后得到的就是最大联通子数组的和。

  程序源代码:

  1 package 最大子数组;
  2 
  3 import java.util.Scanner;
  4 
  5 public class judge2 {
  6 
  7     public static void main(String[] args) {
  8         // TODO Auto-generated method stub
  9 
 10 
 11         int m,n,i,j,t2;
 12         Integer smark=new Integer(0);
 13         Integer mmark=new Integer(0);
 14 
 15         int sum;
 16 
 17         int up[]=new int[100];
 18         int down[]=new int[100];
 19         int t[]=new int[100];
 20         int a[][]=new int[100][100];
 21         int b[]=new int[100];
 22             
 23         System.out.println("请输入二维数组的行数和列数:");
 24          Scanner scanner=new Scanner(System.in);
 25         m=scanner.nextInt();
 26         n=scanner.nextInt();
 27         System.out.println("请输入这个二维矩阵:");
 28         
 29         for(i=0;i<m;i++)
 30 
 31         {
 32 
 33             for(j=0;j<n;j++)
 34 
 35             {
 36 
 37                 a[i][j]=scanner.nextInt();;
 38 
 39             }
 40 
 41         }
 42 
 43         //把二维数组按行分解为几个一维数组
 44         for(i=0;i<m;i++)
 45 
 46         {
 47 
 48             for(j=0;j<n;j++)
 49 
 50             {
 51 
 52                 b[j]=a[i][j];
 53 
 54             }
 55 
 56             sum=Max(n,b,smark,mmark);
 57 
 58             up[i]=smark;                                    
 59 
 60             down[i]=mmark;
 61 
 62             t[i]=sum;
 63 
 64      
 65 
 66         }
 67 
 68         t2=t[0];
 69 
 70         for(i=0;i+1<m;i++)
 71 
 72         {
 73 
 74             if(up[i]<=down[i+1] && down[i]>=up[i+1])
 75 
 76             {
 77 
 78                 t2+=t[i+1];
 79 
 80             }
 81 
 82              for(j=up[i];j<up[i+1];j++)
 83 
 84             {
 85 
 86                 if(a[i+1][j]>0) t2+=a[i+1][j];                   //判别独立正数
 87 
 88             }
 89 
 90      
 91 
 92         }
 93 
 94         System.out.println(t2);   
 95     }
 96     public static int Max(int n,int a[],Integer smark,Integer mmark)
 97 
 98     {
 99 
100         int b[]=new int [100];
101 
102         int i,sum1= Integer.MIN_VALUE,max1=0;
103         int j=0;
104         for(i=0;i<n+j;i++)
105 
106         {
107 
108             if(sum1<0)
109 
110             {
111 
112                 sum1=a[i%n];
113                 j=i;
114             }
115 
116             else
117 
118             {
119 
120                 sum1=sum1+a[i%n];
121 
122             }
123            
124             b[i]=sum1;
125 
126         }
127 
128         max1=b[0];
129       
130         for(i=0;i<n+j;i++)
131 
132         {
133 
134             if (max1<b[i]) 
135 
136              {
137 
138                  max1= b[i];
139 
140                  mmark = i;
141                 
142 
143              }
144             
145         }
146 
147          for (i = mmark;i >= 0;i--) 
148 
149         {
150 
151             if (b[i] == a[i]) 
152 
153             {
154 
155                  smark = i;
156 
157                  break;
158 
159             }
160 
161         }
162 
163          return max1;
164 
165     }
166 }
167         

 

  程序运行结果截图:

技术分享技术分享

返回一个二维整数数组中最大联通子数组的和