二维数组环和最大子数组的和

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.实验截图

posted @ 2015-04-20 17:23  非非是  阅读(343)  评论(1编辑  收藏  举报