leetcode动态规划

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;
}

原文地址:https://www.cnblogs.com/cute/p/15325093.html