设计思路:
(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)); } }
程序截图:
时间: 2024-10-15 07:48:50