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]的最大值即为子数组的最大和值