这道题和max subarray很类似,我用local 和 global 的dp方式阔以解决这道
那么我们来看动态规划的四个要素分别是什么?
State:
localmin[i] 表示以当前第i个数最为结尾的最小连续子数组和。
globalmin[i] 表示以当i个数里面(可以不以第i个作为结尾)的最小连续子数组和。
Function:
localmin[i] = min(localmin[i - 1] + nums.get(i), nums.get(i));
globalmin[i] = min(globalmin[i - 1], localmin[i]);
initialize:
globalmin[0] = localmin[0] = nums.get(0);
answer:
globalmin[n-1]/
优化:
由于这道题第i个状态只跟i-1的状态有关,所以这道题还可以用滚动数组
vector<int> localMin(nums.size()); vector<int> globalMin(nums.size()); localMin[0]=globalMin[0]=nums[0]; for(int i=1;i<nums.size();i++){ localMin[i]=min(localMin[i-1]+nums[i],nums[i]); globalMin[i]=min(globalMin[i-1],localMin[i]); } return globalMin[nums.size()-1];