问题描述:
给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],...,a[n],求该序列如:
a[i]+a[i+1]+..+a[j]。当所给的整数均为负数时定义子段和为0.如果序列中全部是负数则
最大子段和为0,依次所定义:所求的最优值max{0,a[i]+a[i+1]+...+a[j]},1<=i<j<=n.
问题解析(动态规划算法):
dp[i]:包含元素i的子段和
dp[0]:0
dp[1]:arr[1] + dp[0] = 11
dp[2]:11 + dp[1] = 7
dp[3]:7 + dp[2] = 20
dp[4]:20 + dp[3] = 15
dp[5]:15 + dp[4] = 13
例如(-2,11,-4,13,-5,2)的最大子段和为20,所求子区间为[2,4].
如果该序列的所有元素都是负整数时定义其最大子段和为0。
代码示例:
public class maxChar{
public static void main(String[] args) {
int[] arr = {-2,11,-4,13,-5,-2};
int[] dp = new int[arr.length];
dp[0] = arr[0];
if(arr[0] < 0) {
dp[0] = 0;
}
int max = dp[0];
for(int i = 1;i <= arr.length;i++) {
dp[i] = arr[i] + dp[i - 1];
if(dp[i] < 0) {
dp[i] = 0;
if(max < dp[i]) {
max = dp[i];
}
}
System.out.println(Arrays.toString(dp));
System.out.println(max);
}
}