LintCode 191.乘积最大的子序列
这也是一道最值型动态规划的典型题目,构建状态转移方程时,使用max和min。
代码:
class Solution {
public:
/**
* @param nums: An array of integers
* @return: An integer
*/
int maxProduct(vector<int> &nums) {
if (0 == nums.size()) {
return nums[0];
}
//初始化
int n = nums.size();
vector<int> f(n, INT_MIN);//f[i]代表以nums[i]结尾的乘积最大的连续子序列
vector<int> g(n, INT_MAX);//g[i]代表以nums[i]结尾的乘积最小的连续子序列
//状态转移
for (int i = 0; i < n; ++i) {
f[i] = nums[i];
if (i - 1 >= 0) {
f[i] = max(f[i], max(nums[i] * f[i - 1], nums[i] * g[i - 1]));
}
g[i] = nums[i];
if (i - 1 >= 0) {
g[i] = min(g[i], min(nums[i] * f[i - 1], nums[i] * g[i - 1]));
}
}
auto max = max_element(f.begin(), f.end());
return *max;
}
};