public class MaximumSubarray {
public static int ms(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int[][] dp = new int[arr.length+1][arr.length+1];
int max = arr[0];
// i表示子数组长度,j表示起始位置
for (int j = 1; j <= arr.length; j++) {
dp[j][1] = arr[j-1];
}
for (int i = 2; i <= arr.length; i++) {
for(int j = 1; j+i-1 <= arr.length; j++) {
dp[j][i] = dp[j][i-1] + arr[j-1 + i-1];
if (dp[j][i] > max) {
max = dp[j][i];
}
}
}
return max;
}
public static void main(String[] args) {
System.out.println(ms(new int[]{-2,1,-3,4,-1,2,1,-5,4}));
System.out.println(ms(new int[]{1}));
System.out.println(ms(new int[]{5,4,-1,7,8}));
}
}解题思路:
构造dp数组, dp[j][i] 代表从j位置开始i长度的子数组的sum值。 这些sum值里最大的就是子数组之和的最大值。
这里避免重复计算的过程是当前子数组长度-1的子数组求和过程
记录长度i为1的数组和为此位置元素的值。即 dp[j][1] = arr[j-1]
子数组长度为i>=2时,子数组之和为同样开始位置i-1长度子数组的值加上i长度子数组最后一个元素的值。 即 dp[j][i] = dp[j][i-1] + arr[j-1 + i-1];
计算dp过程中,记录dp[j][i]的最大值即为子数组的最大和值
该代码使用动态规划方法解决最大子数组和问题。构建dp数组,dp[j][i]存储从位置j开始长度为i的子数组之和。初始化dp[j][1]为arr[j-1],然后对于长度大于1的子数组,dp[j][i]=dp[j][i-1]+arr[j-1+i-1],在计算过程中更新最大子数组和。
382

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



