如输入:
-2 11 -4 13 -5 -2
输出:
20
为:11+(-4)+13
package com.xjj.algorithm;
import java.util.Scanner;
/*----最大连续子序列和--动态规划----
* 1.令dp[i] 为以 A[i] 结尾的的连续序列的最大和,必须以A[i]结尾;有A[i]结尾有如下两种情况:
* a.以A[i]开始,以A[i]结束:其最大连续和为其本身;
* b.从某个位置开始,以A[i]结束:最大连续和为 dp[i-1]+A[i];
*
* 2.状态转移方程为:dp[i] = max(A[i], dp[i-1] + A[i]);
* 3.边界dp[0] = A[0]: 递推--自底向上
*
* 4.O(n)
*
*
* */
public class Max_sum {
private static int n;
public void sum(int[] a){
int[] dp = new int[n];
//初始化并设置边界
dp[0] = a[0];
//遍历--状态转移
for(int i = 1; i < n; i++)
dp[i] = Math.max(a[i], dp[i-1] + a[i]);
//找到和最大值
int max = dp[0];
for(int i = 1; i < n; i++)
if (max < dp[i])
max = dp[i];
System.out.println(max);
}
public static void main(String[] args){
System.out.println();
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
int[] a = new int[n];
for(int i = 0; i < n; i++)
a[i] = scanner.nextInt();
Max_sum am = new Max_sum();
am.sum(a);
}
}