【C++编程能力提升】

代码随想录训练营Day51 | Leetcode 309、714

  • 一、309 买卖股票的最佳时机含冷冻期
  • 二、714 买卖股票的最佳时机含手续费

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

题目链接:309 买卖股票的最佳时机含冷冻期

核心:增加冷冻期后买卖股票的状态只能是——买入,卖出,冷冻期(仅一天),买入,卖出。
冷冻期的存在使【不持有股票】可分成2种状态:其一不持有且可买入,其二不持有且冷冻期(即不可买入)。
综上,dp数组有三种状态:
d[i][0]:持有股票所得的现金;dp[i][1]不持有股票且可买入所得的现金,dp[i][2]不持有股票且冷冻期所得的现金。
针对dp[i][0]持有股票可存在两种情况,要么i-1已持有,要么i天买入(i-1必然是不持有且可买入);
针对dp[i][1]不持有股票且可买入也存在两种情况,要么i-1已不持有且可买入,要么i-1不持有且冷冻期(意味着i可买入);
针对dp[i][2]不持有股票且冷冻期只有一种情况,即i-1必然是持有股票且卖出,这是因为冷冻期只有一天。

    int maxProfit(vector<int>& prices) {
        //动态规划:冷冻期的存在使得不持有股票有两种状态,其一是不持有可买入,其二不持有冷冻期
        int len=prices.size();
        if(len==0)  return 0;
        vector<vector<int>> dp(len,vector<int>(3,0));   //共有三个状态
        //dp[i][0]持有股票所得现金,dp[i][1]不持有股票且可买入,dp[i][2]不持有股票且冷冻期
        dp[0][0]=-prices[0];    
        for(int i=1;i<len;++i)
        {
            dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]); //要么i-1持有,要么i买入
            dp[i][1]=max(dp[i-1][1],dp[i-1][2]); //要么i-1维持,要么i-1不持有且冷冻期
            dp[i][2]=dp[i-1][0]+prices[i]; //只能i-1卖出,因为冷冻期只有一天
        }
        return max(dp[len-1][1],dp[len-1][2]);
    }

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

题目链接:714 买卖股票的最佳时机含手续费

核心:每次交易需要手续费,也就是说每次卖出时增加一个手续费。其他与常规多次交易相同。
两种状态:dp[i][0]持有股票所得的现金,dp[i][1]不持有股票所得的现金。
初始化:第0天持有现金时需要初始化,因为买入需要花钱。

    int maxProfit(vector<int>& prices, int fee) {
        //动态规划:每次交易存在手续费,意味着卖出时增加一个手续费
        int len=prices.size();
        if(len==0)      return 0;
        vector<vector<int>> dp(len,vector<int>(2,0));
        //两个状态:dp[i][0]持有股票所得现金,dp[i][1]不持有股票所得现金
        dp[0][0]=-prices[0];
        for(int i=1;i<len;++i)
        {
            dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]); //要么i-1不持有要么i天买入
            dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]-fee); //注意i天卖出时增加了fee
        }
        return dp[len-1][1];
    }

你可能感兴趣的:(C++编程,c++,leetcode,动态规划)