4.最大子数组问题
最大子序和(LeetCode 53题 难度:简单)
dp数组定义
dp[i]就是以nums[i]结尾的"最大子数组的和"
dp[i]有两种选择:
要么与前面相邻的子数组连接,形成一个更大的子序和的数组
要么不与前面连接,自成一派,自己作为一个子数组
要么 自成一派,要么与前面的子数组合 并形成更大的数组
dp[i]=Math.max(nums[i],dp[i-1]+nums[i]);
综上 已经得到了状态转移方程
完整代码:
public int maxSubArray(int[] nums) {
int n=nums.length;
if(n==0){
return 0;
}
int dp[]=new int[nums.length];
//base base
dp[0]=nums[0];
int res=Integer.MIN_VALUE;
for (int i = 1; i < n ; i++) {
//状态转移方程
//要么 自成一派,要么与前面的子数组合 并形成更大的数组
dp[i]=Math.max(nums[i],dp[i-1]+nums[i]);
}
for (int i = 0; i < dp.length; i++) {
res= Math.max(res,dp[i]);
}
return res;
}