最大连续子数组和
一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3
输入描述:
输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。
输出描述:
所有连续子数组中和最大的值。
示例:
示例1
输入
3 -1 2 1
输出
3
分析:
动态规划问题:
(1)状态:dp[n]表示以num[n]结尾的最大连续子数组和
以3结尾的子数组:【3】
以-1结尾的子数组:【3,-1】,【-1】
以-1结尾的子数组:【3,-1,2】,【-1,2】,【2】
可以发现dp[n]是num[n]或者dp[n-1]+num[n]的最大值
(2)状态递推:dp[n] = Math.max(dp[n-1],0) + num[n];
(3)初始值:dp[0] = num[0]
(4)返回值:dp[i]中的最大值(因为最大连续子数组和不一定以num[n]结尾)
可以用max来存dp[i]的最大值,不断更新 max的值即可
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] num = new int[n];
for(int i=0; i<n; i++){
num[i] = in.nextInt();
}
int sum = num[0];
int max = num[0];
for(int i=1; i<n; i++){
sum = Math.max(sum,0)+num[i];
if(max < sum){
max = sum;
}
}
System.out.println(max);
}
}