动态规划:最佳买卖股票时机

309. 最佳买卖股票时机含冷冻期 - 力扣(LeetCode)

题目描述:

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

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

  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

解题思路:

在这里插入图片描述

根据示例,只在卖出时计算收益,即不会有负收益。

当我们处于第i天,我们可以选择卖出和买入:

  • 若要卖出,则选择在之前哪一天买入能产生最大收益;
  • 若要买入,则今天的最大收益是之前卖出股票的最大收益(不包括前一天);

那么我们得到以下状态转移方程:

s e l l [ i ] = m a x ( b u y [ j ] + p r i c e s [ i ] − p r i c e s [ j ] ) , i > 0 , j ∈ [ 0 , i − 1 ] sell[i] = max(buy[j] + prices[i] - prices[j]),i>0,j\in[0,i-1] sell[i]=max(buy[j]+prices[i]prices[j]),i>0,j[0,i1]

b u y [ i ] = m a x ( s e l l [ j ] ) , i > 0 , j ∈ [ 0 , i − 2 ] buy[i]=max(sell[j]),i>0,j\in[0,i-2] buy[i]=max(sell[j]),i>0,j[0,i2]

初始状态sell[0]=0,buy[0]=0;

sell[i]表示在第i天卖出股票的最大收益(之前已经买入了股票);

buy[i]表示在第i天买入股票的最大收益(即之前卖出股票的最大收益);

因此,有以下代码(C++):

#define max(a,b) a>b?a:b 
#define MIN 0x80000000
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<int> sell(n);
        vector<int> buy(n);
        int ans = 0;
        for(int i=1; i<n; i++){
            for (int j=0; j<i; j++){
                sell[i] = max(sell[i], buy[j] + prices[i]-prices[j]);
                if(i-j > 1){
                    buy[i] = max(buy[i], sell[j]);
                }
            }
            ans = max(ans, sell[i]);
        }
        return ans;
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值