【C++编程能力提升】

一、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];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值