最小子列和的动态规划
Given an integer array nums
, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
Example:
Input: [-2,1,-3,4,-1,2,1,-5,4], Output: 6 Explanation: [4,-1,2,1] has the largest sum = 6.
分治法:
public int maxSubArray(int[] nums) {
return devideconquer(nums,0,nums.length-1);
}
public int devideconquer(int[] nums, int l, int r){
if(l==r) return nums[l];
int mid = (l+r)/2;
int maxLeft = devideconquer(nums,l,mid);
int maxRight = devideconquer(nums,mid+1,r);
int maxSide = Math.max(maxLeft,maxRight);
int acrossLeft = Integer.MIN_VALUE;
int sumLeft = 0;
for(int i=mid;i>=l;i--){
sumLeft += nums[i];
acrossLeft = Math.max(acrossLeft,sumLeft);
}
int acrossRight = Integer.MIN_VALUE;
int sumRight = 0;
for(int i=mid+1;i<=r;i++){
sumRight += nums[i];
acrossRight = Math.max(acrossRight,sumRight);
}
return Math.max(maxSide,acrossLeft+acrossRight);
}
动态规划法:
若加和为正数则会继续向后加,若加和为负数,则停止又从下一个数开始。
public int maxSubArray(int[] nums) {
int[] dp=new int[nums.length];
dp[0]=nums[0];
int Max=nums[0];
for(int i=1;i<dp.length;i++){
dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);
Max=Math.max(dp[i],Max);
}
return Max;
}