设计思路:
(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));
}
}
程序截图:

原文:http://www.cnblogs.com/ygl888/p/5388515.html