{1,-3,7,8,-4,12,-10,6} , 最大和子序列为 {7,8,-4,12} ,最大和为23
方法1,O(N)的优化算法,只求和,不输出序列的起点和终点
方法2,o(n),既求和,也求该序列的起点和终点(输出该子序列)
/**
* 求解思路:用sum(j)表示a1到aj的和,很容易求出动态规划的递归式:
* sum(j) = max(sum(j-1)+aj , aj)
* 时间复杂度:O(N)
* 动态规划的好处在于,能很清楚的返回最佳连续子序列和的起始位置和终点位置
*
*/
import java.util.Scanner;
public class Main03_3 {
public static void main(String [] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int [] nums = new int[n];
for(int i = 0;i<n;i++){
nums[i] = sc.nextInt();
}
//System.out.println(maxSub(nums));
System.out.println(maxSub2(nums));
}
//只求和,不求起点和终点
public static int maxSub(int [] arr){
if(arr == null || arr.length == 0)
return 0;
int maxsum = 0;
int tempsum = 0;
for(int i = 0;i<arr.length;i++){
tempsum += arr[i];
if(tempsum>maxsum){
maxsum = tempsum;
}
if(tempsum<0){
tempsum = 0;
}
}
return maxsum;
}
//求最大连续子序列的和,以及输出该子序列
public static int maxSub2(int [] arr){
if(arr== null || arr.length == 0)
return 0;
int maxsum = 0;
int tempsum = 0;
int begin = 0;//最大连续子序列和的起点
int end = 0;//最大连续子序列和的终点
for(int i = 0;i<arr.length;i++){
if(tempsum>0){
tempsum+=arr[i];
}else {
tempsum = arr[i];
begin = i;
}
if(tempsum>maxsum){
maxsum = tempsum;
end = i;
}
}
for(int i = begin;i<=end;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
return maxsum;
}
}