leetcode买卖股票、动态规划

买卖股票的最佳时期
买卖股票的最佳时期2
买卖股票的最佳时期3
买卖股票的最佳时期4
最佳买卖股票时机含冷冻期

买卖股票的最佳时期

int maxProfit(vector<int>& prices) {
        int n = prices.size();
        //初始化状态:
        int pro = 0;//第0天的最大利润
        int minn = prices[0];//第0天的历史最低价格
        //从第一天开始,i表示天
        for(int i = 1 ; i < n ; i++){
            pro = max(prices[i]-minn, pro);//第i天的最大利润,有可能还是第i-1天的最大利润,也有可能是第i天的价格减去历史最低价格,此时minn的值为[0,i-1]天中的最低价格
            minn = min(minn, prices[i]);//更新最低价格,此时minn为[0,i]天中的最低价格
        }
        return pro;
    }

买卖股票的最佳时期2

int maxProfit(vector<int>& prices) {
        int n = prices.size();
        //dp[i][0]为当天未持有股票的利润
        //dp[i][1]为当天持有一只股票的利润
        vector<vector<int>> dp(n, vector<int>(2,0));//dp[i]表示第i天的利润
        //初始化
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for(int i = 1; i < n; i++){
            //第i天未持有股票,可能是前一天也未持有,也有可能是今天刚卖
            dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i]);
            //第i天持有股票,可能是前一天也持有,也有可能是今天刚买
            dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i]);
        }
        return max(dp[n-1][0],dp[n-1][1]);
    }

买卖股票的最佳时期3

int maxProfit(vector<int>& prices) {
        int n = prices.size();
        int buy1 = -prices[0], sell1 = 0, buy2 = -prices[0], sell2 = 0;
        for(int i = 1; i < n; i++){
            buy1 = max(buy1, -prices[i]);
            sell1 = max(sell1, buy1+prices[i]);
            buy2 = max(buy2, sell1-prices[i]);
            sell2 = max(sell2, buy2+prices[i]);
        }

        return sell2;
    }

买卖股票的最佳时期4

int maxProfit(int k, vector<int>& prices) {
        int n = prices.size();
        if( n <= 1)
            return 0;
        k = min(k, n/2);
        vector<int> buy(k+1, -10001);
        vector<int> sell(k+1, -10001);
        buy[0] = -prices[0];
        sell[0] = 0;
        for(int i = 1; i < n; i++){
            buy[0] = max(buy[0], sell[0]-prices[i]);
            for(int j = 1; j <= k; j++){
                buy[j] = max(buy[j], sell[j]-prices[i]);
                sell[j] = max(sell[j], buy[j-1]+prices[i]);
            }
        }
        return *max_element(sell.begin(),sell.end());
    }

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

int maxProfit(vector<int>& prices) {
        //假设每天交易时间为晚上9点
        int n = prices.size();
        if(n == 0)
            return 0;
        vector<vector<int>> dp(n, vector<int>(3,0));//n表示为第几天9点01秒
        dp[0][0] = -prices[0];  //第0天9:01 秒持有股票
        dp[0][1] = 0;   //第0天9:01 不持有股票且今天结束冷冻期
        dp[0][2] = 0;   //第0天9:01 不持有股票且不处于冷冻期
        //循环:天数
        for(int j = 1; j < n; j++){
            dp[j][0] = max(dp[j-1][0], dp[j-1][2]-prices[j]);//持有股票,可能是刚买入,也有可能昨天也持有
            dp[j][1] = dp[j-1][0]+prices[j];//处于冷冻期了,今天肯定卖了
            dp[j][2] = max(dp[j-1][2], dp[j-1][1]);//不处于冷冻期,可能是冷冻期刚过,或者昨天也不是冷冻期
        }
        return max(max(dp[n-1][0],dp[n-1][1]),dp[n-1][2]);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值