{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;
}
}
本文深入探讨了求解最大和子序列问题的两种高效算法,一种仅计算最大和,另一种同时找出最大和子序列的具体范围。通过动态规划的方法,实现了O(N)的时间复杂度,极大提高了计算效率。
631

被折叠的 条评论
为什么被折叠?



