Java求数组的最大字段和
-
原问题
给定⼀个数组,求这个数组的连续⼦数组中,最⼤的那⼀段的和。 如数组[-2,1,-3,4,-1,2,1,-5,4] 的⼦段为:[-2,1]、[1,-3,4,-1]、[4,-1,2,1]、…、[-2,1,-3,4,-1,2,1,-5,4],和最⼤的是[4,1,2,1],为6。 -
⼦问题
-. 只考虑第⼀个元素,则最⼤⼦段和为其本身 DP[0] = nums[0]
-. 考虑前两个元素,最⼤⼦段和为 nums[0],num[1]以及 nums[0] + num[1] 中最⼤值 设为DP[1]
-. 考虑前三个元素,如何求其最⼤⼦段和?还是分为两种情况讨论,第三个元素在最后的字串内吗?
-. 若第三个元素也包含在最后的字串内,则DP[2] = Max(DP[1]+nums[2] , nums[2]) -
确认状态
DP[i] 为 以nums[i]结尾的⼦段的最⼤最短和
例如 DP[1]则为以nums[1]结尾的最⼤字段和 -
初始状态
dp[0] = nums[0]
dp[1] = max(dp[0]+nums[1] , nums[1]) -
状态转移⽅程:
dp[i] = max(dp[i-1]+nums[i],nums[i])
public static int maxNumsSum(int[] arr){
//判断非法输入情况
if(arr.length < 1){
return 0;
}
//设置dp数组,dp[i]为以arr[i]结尾的⼦段的最⼤字段和
int[] dp = new int[arr.length];
//初始化值
dp[0] = arr[0];
//初始化最大字段和
int max = dp[0];
//根据状态转移方程求出dp[i]
for (int i = 1; i < arr.length; i++) {
dp[i] = Math.max(dp[i-1] + arr[i], arr[i]);
//修改最大字段和
if (dp[i] > max){
max = dp[i];
}
}
return max;
}