动态规划-股票交易1

动态规划解题

  dp[i][k][j] 第i天  k限制交易次数 通过买卖到什么状态(有股票,或者没有股票)
        0代表没有股票 有两种可能 前一天本身没有或者是昨天拥有今天卖了
        //dp[i][0] = max(dp[i-1][0],dp[i-1][1]+price[i]); dp[0][0]  = 0
        //dp[i][1] = max(dp[i-1][1],dp[i-1][0]-price[i]);dp[0][1]=-INT_MAX

为了节约数组空间,同时只涉及到i和i-1,使用2个变量就可以解决

dpi0 = 0;//表示初始化不持有股票,利润为0

dpi1 = -INT_MAX;//初始时未交易持有股票,不可能

状态转移

  dpi0 = max(dpi0,dpi1+prices[i]);//昨天不持有 或者 昨天持有卖出股票、
  dpi1 = max(dpi1,-prices[i]);//昨天持有,或者 昨天不持有买入,k=0,表示还没有交易因此只能是-prices[i];
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //dp[i][k][j] 第i天  k限制交易次数 通过买卖到什么状态(有股票,或者没有股票)
        //0代表没有股票 有两种可能 前一天本身没有或者是昨天拥有今天卖了
        //dp[i][0] = max(dp[i-1][0],dp[i-1][1]+price[i]); dp[0][0]  = 0
        //dp[i][1] = max(dp[i-1][1],dp[i-1][0]-price[i]);dp[0][1]=-INT_MAX
        
        //k=0 不限制交易次数
        int dpi0 = 0;
        int dpi1 = -INT_MAX;//没买的时候就持有不可能
        for(int i=0;i<prices.size();++i)
        {
            dpi0 = max(dpi0,dpi1+prices[i]);//昨天不持有 或者 昨天持有卖出股票、
            dpi1 = max(dpi1,-prices[i]);//昨天持有,或者 昨天不持有买入,k=0,表示还没有交易因此只能是-prices[i];
        }
        return dpi0;//因为不持有股票这时利润绝对最低
    }
};

posted @ 2021-09-29 12:53  勒勒乐了  阅读(45)  评论(0)    收藏  举报