只提供思路不提供代码
问题分析
在这道题目中,我们的目标是在多次买卖股票的情况下获得最大利润,但需要遵循以下规则:
- 买入之前必须卖出手中的股票,即不能同时持有多个股票。
- 每次卖出股票后,需要有一天的冷冻期(不能立即买入新股票)。
为了解决这个问题,我们可以用动态规划来跟踪在每一天的最大利润。
动态规划思路
我们定义三种状态,每种状态都表示在第 i 天结束时的最大利润:
- 持有股票(hold) :在第
i天结束时持有股票的最大利润。 - 卖出股票(sell) :在第
i天结束时卖出股票的最大利润。 - 冷冻期(rest) :在第
i天结束时处于冷冻期(即不持有股票、不卖出)的最大利润。
状态转移方程
-
hold[i]表示第i天结束时持有股票的最大利润。我们可以从前一天的hold[i-1]直接转移过来(即前一天也持有股票,今天什么也不做),或者在今天买入股票(前一天必须处于rest[i-1]状态,因为冷冻期限制)。所以:hold[i]=max(hold[i−1],rest[i−1]−stocks[i])hold[i] = \max(hold[i-1], rest[i-1] - stocks[i])hold[i]=max(hold[i−1],rest[i−1]−stocks[i])
-
sell[i]表示第i天结束时卖出股票的最大利润。这个状态只能从hold[i-1]转移而来,即前一天持有股票,今天卖出股票。因此:sell[i]=hold[i−1]+stocks[i]sell[i] = hold[i-1] + stocks[i]sell[i]=hold[i−1]+stocks[i]
-
rest[i]表示第i天结束时不持有股票且没有卖出的最大利润。我们可以从rest[i-1]转移过来(即前一天也在冷冻期或没有持有股票),或者从sell[i-1]转移过来(前一天刚卖出股票)。因此:rest[i]=max(rest[i−1],sell[i−1])rest[i] = \max(rest[i-1], sell[i-1])rest[i]=max(rest[i−1],sell[i−1])
初始条件
在第 0 天,初始条件如下:
hold[0] = -stocks[0]:表示第 0 天买入股票后的利润(负数)。sell[0] = 0:第 0 天不可能卖出股票,利润为 0。rest[0] = 0:第 0 天不进行任何操作,利润为 0。
最终结果
最终的最大利润是所有天数结束时不持有股票的情况,即 max(sell[n-1], rest[n-1]),其中 n 是股票价格数组的长度。