leetcode第53题、152题动态规划思路
53:和最大子序列
对于和最大子序列,暴力枚举的方法思路简单但是复杂度太高(O(n^3))。
对于数组A[],记以A[i]为结尾的所有子数组的和的局部最大值为local_max,当前所有子数组的全局最大值为global_max,则有
local_max = max(local_max + A[i], A[i])
global_max = max(local_max, global_max)
以C++代码为例,
在这里插入代码片
int local = nums[0];
int global = nums[0];
for (auto i = 1; i < nums.size(); ++i){
local = (local + nums[i] > nums[i]) ? local + nums[i] : nums[i];
global = (local > global) ? local : global;
}
return global;
152:乘积最大子序列
与求和最大子序列类似,也采用动态规划的方法,但考虑到正负的问题,要同时维护两个局部值,分别是局部最大local_max和局部最小local_min,则有
local_max_copy = local_max //保存当前局部最大
local_max = max(local_maxA[i], local_minA[i], A[i])
local_min = min(local_max_copyA[i], local_minA[i], A[i])
global = max(local_max,global)
以C++代码为例,
int local_max = nums[0];
int local_min = nums[0];
int global = nums[0];
for (auto i = 1; i < nums.size(); ++i){
int local_max_copy = local_max;
local_max = (local_max * nums[i] > local_min * nums[i]) ? local_max * nums[i] : local_min * nums[i];
local_max = local_max > nums[i] ? local_max : nums[i];
local_min = local_max_copy * nums[i] < local_min * nums[i] ? local_max_copy * nums[i] : local_min * nums[i];
local_min = local_min < nums[i] ? local_min : nums[i];
global = global > local_max ? global : local_max;
}
return global;