二维数组环和最大子数组的和
1.实验要求
随机产生一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
2.实验思路
先随机产生一个二维数组;
二维数组的第一列移动到最后一列,求最大的子数组和;
二维数组的第一列移动到最后一列,求最大的子数组和;
二维数组的第一列移动到最后一列,求最大的子数组和;
······
直到循环完毕。
3.完整代码
package 二维环; import java.util.Random; import java.util.Scanner; public class b { public static void main(String[] args) { // TODO Auto-generated method stub int a[][]; int i,ii,j,jj,l,h,n,nn,k,kk,sum,max=0; ///随机产生一个数组 Scanner scanner = new Scanner(System.in); System.out.print("输出随机产生的数组的长度:"); h=scanner.nextInt(); System.out.print("输出随机产生的数组的高度:"); l=scanner.nextInt(); scanner.close(); a=new int[l][h]; for(i=0;i<l;i++) { for(j=0;j<h;j++) { Random random = new Random(); a[i][j]=random.nextInt(19); a[i][j]=a[i][j]-9; System.out.print(a[i][j]); System.out.print(" "); } System.out.println(""); } for(nn=0;nn<h;nn++) { for(ii=0;ii<l;ii++)//l行的第一个数放到最好 { kk=a[ii][0]; for(jj=0;jj<h-1;jj++)//每一行的第一个数放到最好 { a[ii][jj]=a[ii][jj+1]; } a[ii][jj]=kk; } System.out.println("将数组的第一列放到最后一列: "); for(i=0;i<l;i++)/////////aaa输出动后的数组 { for(j=0;j<h;j++) { System.out.print(a[i][j]); System.out.print(" "); } System.out.println(""); }////////////////////////aaa输出动后的数组 //max=0; for(n=0;n<l;n++) { sum=0; for(i=0;i<l-n;i++) { sum=0; for(j=0;j<h;j++) { for(k=i;k<=i+n;k++) { sum=sum+a[k][j]; } //System.out.print(sum); //System.out.print(" "); if(sum<0) { sum=0; } if(max<sum) { max=sum; } } } } System.out.print("目前求得的最大和的子数组的和为: "); System.out.println(max); } } }
4.实验截图