课堂作业03

设计思路:

(1)将原数组扩展;扩展为原来的2倍减1。

(2)第一个for循环控制数组从哪一数开始进行最大子数组的求和。长度为原数组的长度。

(3)第二个for循环为动态规划求最大子数组。长度为原数组的长度减1.

(4)将求得的最大和用一个数组存储。求该数组的最大值。即为循环数组的子数组的最大和。

源代码:

import java.util.Scanner;
public class MaxOfSubArray2 {
	public static int Max1(int arr1[])
	{
		int arr2[]=new int[2*arr1.length-1];
		for(int i=0;i<arr1.length;i++)
		{
			arr2[i]=arr1[i];
		}
		for(int j=0;j<arr1.length-1;j++)
		{
			arr2[j+arr1.length]=arr1[j];
		}//扩展数组
		int maxsum0=0;
		int maxsum1=0;
		int maxsum[]=new int[arr1.length];
		for(int k=0;k<arr1.length;k++)//从哪一个数开始
		{
			int sum=arr1[k];
		    maxsum1=arr1[k];
			for(int m=k+1;m<arr1.length+k;m++)//动态规划求最大和
			{
				
			    if(sum<0)
			    {
			    	sum=0;
			    }
			    sum+=arr2[m];
			    if(sum>maxsum1)
				{
					maxsum1=sum;
				}
			}
			maxsum[k]=maxsum1;
		}
		for(int n=1;n<maxsum.length;n++)
		{
			if(maxsum[n]>maxsum[0])
			{
				maxsum0=maxsum[n];
			}
		}
		return maxsum0;
		
	}
	public static void main(String[] args)
	{
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入数组长度:");
		int n=sc.nextInt();
		int arr[]=new int[n];
		System.out.println("请输入数组元素:");
		for(int i=0;i<n;i++)
		{
			arr[i]=sc.nextInt();
		}
		System.out.println("子数组的最大和:"+Max1(arr));
	}
	

}

 程序截图:

编译过程中的错误:将maxsum1=arr[k]写到内循环去了。

六,团队照

 

posted @ 2016-04-13 19:50  蝈蝈gl  阅读(150)  评论(0编辑  收藏  举报