day-51 代码随想录算法训练营(19)动态规划 part 12

309.买卖股票的最佳时机含冷冻期

分析:状态->  持有  卖出  冷冻期  冷冻期后没持有
思路:
  • 1.dp存储:四个状态
  • 2.dp[i][0]、dp[i][1]、dp[i][2]、dp[i][3]
  • 3.初始化:dp[0][0]=-prices[i]
  • 4.遍历顺序:1~n

为什么没有一开始就不持有的状态呢?理解为要尽可能多的买卖股票

  • 打印结果之后注意到,持有的状态取的是max,所以当取第二个max的时候,包含了之前不持有的状态;
  • 也就是说,之前持有,现在买入两个中取最大值,是包含了第一次可能不买入的状态的

 day-51 代码随想录算法训练营(19)动态规划 part 12_第1张图片

class Solution {
public:
    int maxProfit(vector& prices) {

        int n=prices.size();
        vector> dp(n,vector(4,0));
        dp[0][0]=-prices[0];

        for(int i=1;i

714.买卖股票的最佳时机含手续费

分析:种状态:持有  不持有   卖出时含手续费
思路:
  • 1.dp存储  dp[i][0] 持有   dp[i][1] 不持有
  • 2.动态转移方程(递推式)
    • dp[i][0]=max(dp[i-1][0],-prices[i])
    • dp[i][1]=max(dp[i-1][1],dp[i][0]+prices[i]-free)
  • 3.初始化:全为0
  • 4.遍历顺序:1~n
class Solution {
public:
    int maxProfit(vector& prices, int fee) {
        int n=prices.size();
        vector> dp(n,vector(2,0));
        dp[0][0]=-prices[0];//持有肯定初始化为这个
        for(int i=1;i

你可能感兴趣的:(#,代码随想录算法训练营(19),算法,动态规划)