https://zhuanlan.zhihu.com/p/150516970
https://zhuanlan.zhihu.com/p/265891102
https://leetcode-cn.com/problems/maximum-product-subarray/submissions/
/*
152. 乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
*/
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<int> maxn, minn;
int maxProduct(vector<int>& nums) {
int n = nums.size(), ans = nums[0];
maxn.resize(n);
minn.resize(n);
maxn[0] = minn[0] = nums[0];
for(int i=1;i<n;i++)
{
if(nums[i]>0)
{
maxn[i]=max(nums[i], maxn[i-1]*nums[i]);
minn[i]=min(nums[i], minn[i-1]*nums[i]);
}
else
{
maxn[i]=max(nums[i], minn[i-1]*nums[i]);
minn[i]=min(nums[i], maxn[i-1]*nums[i]);
}
ans=max(ans, maxn[i]);
}
return ans;
}
};
int main()
{
vector<int> v{2,3,-2,4,-2,0,-1};
// maxn 2 6 -2 4 96 0 0
// minn 2 3 -12 -48 -8 0 -1
Solution s;
cout<<s.maxProduct(v);
return 0;
}
198. 打家劫舍
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<int> maxn;
vector<int> nums;
int rob(vector<int>& nums) {
this->nums =nums;
int n = nums.size();
maxn.resize(n);
maxn[0]=nums[0];
//只有一项的特殊情况
if(n==1)
return maxn[0];
if(nums[1]>nums[0])
maxn[1]=nums[1];
else
maxn[1]=nums[0];
for(int i=2;i<n;i++)
{
maxn[i]=max(maxn[i-2]+nums[i], maxn[i-1]);
}
return maxn[n-1];
}
void print(int i) {
if(i==0)
{
printf("%d ", nums[i]);
return;
}
else if(i==1)
{
printf("%d ", nums[i]);
return;
}
if(maxn[i]==maxn[i-1])
print(i-1);
else
{
print(i-2);
printf("%d ", nums[i]);
}
}
};
int main()
{
vector<int> v{2,7,9,3,1};
Solution s;
cout<<s.rob(v)<<endl;
s.print(v.size()-1);
return 0;
}