leetcode309 最佳买卖股票时机含冷冻期

题目传送门

给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

  1. 输入: prices = [1,2,3,0,2]
    输出: 3
    解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
  2. 输入: prices = [1]
    输出: 0

使用dp[i][j][k]来表示前i天,并且在第i天手里有没有股票,第天是不是卖出的最优解

那么就能推出这样的状态转移方程

     dp[i][0][0]=max(dp[i-1][1][1],dp[i-1][0][0]);
     第i天手里没有股票不卖出的最优解可以从第i-1天手里有股票卖出或者
     从第i-1天手里没有股票不卖出的最优解推来

      dp[i][1][1]=dp[i-1][1][0]+prices[i];
       第i天手里有股票卖出的最优解只能从第i-1天手里有股票不卖出推来
      dp[i][1][0]=max(dp[i-1][0][0]-prices[i],dp[i-1][1][0]);
      第i天手里有股票不卖出的最优解可以从第i-1天手里没股票不卖出或者
      从第i-1天手里有股票不卖出推来

这样维护一个最大的ans就是全局的最优解

class Solution {
public:
    const static int maxn=1e4+10;
    int maxProfit(vector<int>& prices) {
      int dp[maxn][2][2]={0};//前n天,第n天手里有股票

      dp[0][1][0]=-prices[0];//买

      int ans=0;
      for(int i=1;i<prices.size();i++)
      {
          dp[i][0][0]=max(dp[i-1][1][1],dp[i-1][0][0]);
          ans=max(ans,dp[i][0][0]);
          dp[i][1][1]=dp[i-1][1][0]+prices[i];
           ans=max(ans,dp[i][1][1]);
          dp[i][1][0]=max(dp[i-1][0][0]-prices[i],dp[i-1][1][0]);
           ans=max(ans,dp[i][1][0]);
      }



      return ans;
      
    }
};

你可能感兴趣的:(dp,算法,leetcode,动态规划)