赞
踩
确定状态表示 -> dp[i]
的含义
i
位置元素为结尾的所有子数组中的最大和推导状态转移方程
dp[i] = max(nums[i], dp[i - 1] + nums[i])
初始化:dp
表多开一个虚拟结点,避免处理边界
dp[0] = 0
确定填表顺序:从左往右
确定返回值:整个dp
表里的最大值
int maxSubArray(vector<int>& nums)
{
int n = nums.size();
vector<int> dp(n + 1);
dp[0] = 0;
int ret = INT_MIN;
for(int i = 1; i <= n; i++)
{
dp[i] = max(nums[i - 1], dp[i - 1] + nums[i - 1]);
ret = max(ret, dp[i]);
}
return ret;
}
本题因为有环形数组,问题并不好处理,但是可以将问题转化为最大子数组和
思路:
确定状态表示 -> dp[i]
的含义
f[i]
:以i
位置元素为结尾的所有子数组中的最大和g[i]
:以i
位置元素为结尾的所有子数组中的最小和推导状态转移方程
f[i] = max(nums[i], f[i - 1] + nums[i])
g[i] = min(nums[i], g[i - 1] + nums[i])
初始化:dp
表多开一个虚拟结点,避免处理边界
f[0] = g[0] = 0
-> 确保dp[0]
的值,不会影响后面的求和确定填表顺序:从左往右
确定返回值:sum == gmin ? fmax : max(fmax, sum - gmin)
int maxSubarraySumCircular(vector<int>& nums) { int n = nums.size(); vector<int> f(n + 1); vector<int> g(n + 1); int fmax = INT_MIN, gmin = INT_MAX, sum = 0; for(int i = 1; i <= n; i++) { int x = nums[i - 1]; sum += x; f[i] = max(x, x + f[i - 1]); fmax = max(fmax, f[i]); g[i] = min(x, x + g[i - 1]); gmin = min(gmin, g[i]); } return sum == gmin ? fmax : max(fmax, sum - gmin); }
确定状态表示 -> dp[i]
的含义
f[i]
:以i
位置元素为结尾的所有子数组中的最大乘积g[i]
:以i
位置元素为结尾的所有子数组中的最小乘积推导状态转移方程
f[i] = max(nums[i], f[i - 1] * nums[i], g[i - 1] * nums[i])
g[i] = min(nums[i], f[i - 1] * nums[i], g[i - 1] * nums[i])
初始化:dp
表多开一个虚拟结点,避免处理边界
f[0] = g[0] = 1
-> 确保dp[0]
的值,不会影响后面的乘积确定填表顺序:从左往右
确定返回值:f
表里的最大值
int maxProduct(vector<int>& nums) { int n = nums.size(); vector<int> f(n + 1), g(n + 1); f[0] = g[0] = 1; int ret = INT_MIN; for(int i = 1; i <= n; i++) { f[i] = max(nums[i - 1], max(f[i - 1] * nums[i - 1], g[i - 1] * nums[i - 1])); g[i] = min(nums[i - 1], min(f[i - 1] * nums[i - 1], g[i - 1] * nums[i - 1])); ret = max(ret, f[i]); } return ret; }
确定状态表示 -> dp[i]
的含义
f[i]
:以i
位置元素为结尾的所有子数组中,乘积为正数的最长长度g[i]
:以i
位置元素为结尾的所有子数组中,乘积为负数的最长长度推导状态转移方程
初始化:dp
表多开一个虚拟结点,避免处理边界
f[0] = g[0] = 0
确定填表顺序:从左往右,两个表一起填
确定返回值:f
表里的最大值
int getMaxLen(vector<int>& nums) { int n = nums.size(); vector<int> f(n + 1), g(n + 1); int ret = INT_MIN; for(int i = 1; i <= n; i++) { if(nums[i - 1] > 0) { f[i] = f[i - 1] + 1; g[i] = g[i - 1] == 0 ? 0 : g[i - 1] + 1; } else if(nums[i - 1] < 0) { f[i] = g[i - 1] == 0 ? 0 : g[i - 1] + 1; g[i] = f[i - 1] + 1; } ret = max(ret, f[i]); } return ret; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。