一、题目及要求:
题目:
返回一个二维整数数组中最大子数组的和。
要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
二、解题思路:
因为是二维数组首尾相连,所以将两个同样的数组首尾相接合并成一个数组,在用以前求二维数组最大子数组的方法求解(求一行的最大值子数和,然后把下一行的加在这一行上,求最大子数组和,与之前的比较,最大的存放在最大数里,直到加到最后一行,从第一行开始进行直到第二行)。
三、程序源码:
public class mian { public static void main(String[] args) { // TODO Auto-generated method stub int N=5; int M=5; int n=-10; int m=10; int a[][]=new int[N][2*M]; int b[]=new int[2*M]; int A=0; int Max=0; int MAX=0; for(int i=0;i<N;i++) { for(int j=0;j<M;j++) { a[i][j]=(int)(n+Math.random()*(m-n+1)); a[i][M+j]=a[i][j]; } } for(int i=0;i<N;i++) { for(int j=0;j<M;j++) { System.out.printf(a[i][j]+" "); } System.out.println(); } for(int i=0;i<N;i++) { int h=i; for(int s=0;s<2*M;s++) { b[s]=0; } do { int e=0; int c=0; int d=0; for(int k=0;k<2*M-1;k++) { b[k]=b[k]+a[h][k]; } A=b[0]; Max=b[0]; for(int j=1;j<2*M-1;j++) { if(A<0) { A=b[j]; if(Max<A) { Max=A; e=j; c=j; d=e; } else { e=j; } } else { if((j-d)==M) { break; } if(b[j]<0) { if(Max<A) { Max=A; c=j-1; d=e; } A=A+b[j]; } else { A=A+b[j]; if(Max<A) { Max=A; c=j; d=e; } } } } if(h==0) { MAX=Max; } else if(MAX<Max) { MAX=Max; } h++; }while((h<N)); } System.out.print("最大字数组和为:"+MAX); } }
四、程序运行截图:
五、总结:
通过这次实验对问题的分析,问题的解决都有了一定的思路,遇到问题能静下心来去思考解决办法,不在烦躁。对实验思路还是不清不楚,总是一边写代码一边想办法解决。