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

Posted 风飘万点江满月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了返回一个二维整数数组中最大联通子数组的和相关的知识,希望对你有一定的参考价值。

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

  程序源代码:

  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         

 

  程序运行结果截图:

以上是关于返回一个二维整数数组中最大联通子数组的和的主要内容,如果未能解决你的问题,请参考以下文章

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

返回二维数组最大联通子数组的和

软件工程个人作业05(二维数组求最大子数组的和)

二维数组最大联通子数组和

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

二维数组求最大连通子数组的和