应用题-动态规划-买卖股票的最佳时机含冷冻期

管理员
**分清状态,以及状态转移的方式。** ```python class Solution: # 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。​ # 设计一个算法计算出最大利润。在满足以下约束条件下,可以尽可能地完成更多的交易(多次买卖一支股票): # - 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。 # 注意:不能同时参与多笔交易(必须在再次购买前出售掉之前的股票)。 def maxProfit(self, prices: List[int]) -> int: n = len( prices ) if n == 0 or n == 1: return 0 # 每天的状态: 非冷冻期不持有股票、冷冻期不持有股票、持有股票 # dp[ i ][ j ] 第i天时,状态j # (0非冷冻期不持有股票 1冷冻期不持有股票 2持有股票) 的最大利润 dp = [ [ 0, 0 , 0 ] for _ in range( n ) ] dp[ 0 ][ 2 ] = -prices[ 0 ] """ 时间 发生的事情 状态 第 i-1 天开盘 持有股票 — 第 i-1 天盘中 卖出 — 第 i-1 天收盘 进入冷冻期 dp[i-1][1] 第 i 天全天 禁止任何交易 冷冻期仍在持续 第 i 天收盘 冷冻期结束 不持有股票且不处于冷冻期 ┌───────────────────────────────────────┐ ▼ │ ┌─────────┐ 卖出(当天) ┌─────────┐ │ 持有 ─────────────► 冷冻期 │ └─────────┘ └─────────┘ │ ▲ │ │ │ │ 过一天 │ │ 买入 │ 冷冻解除 │ │ ▼ │ │ 从无冷冻买入 ┌────────┐ │ └──────────────────────│ 无冷冻 │───────┘ └────────┘ """ for i in range( 1, n ): # 不持有股票且不处于冷冻期的最大利润等于 -> # 前一天不持有股票的最大利润、前一天处于冷冻期的最大利润( 前一天卖出今天就是冷冻期 ) dp[ i ][ 0 ] = max( dp[ i - 1 ][ 0 ], dp[ i - 1 ][ 1 ] ) # 不持有股票且处于冷冻期的最大利润等于 -> # 前一天持有股票的最大利润加上当前股票的价格( 前一天卖出今天就是冷冻期 ) dp[ i ][ 1 ] = dp[ i - 1 ][ 2 ] + prices[ i ] # 持有股票的最大利润等于 -> # 前一天持有股票的最大利润、前一天不持有股票且不处于冷冻期的最大利润减去当前股票的价格 dp[ i ][ 2 ] = max( dp[ i - 1 ][ 2 ], dp[ i - 1 ][ 0 ] - prices[ i ] ) return max( dp[ n - 1 ][ 0 ], dp[ n - 1 ][ 1 ], dp[ n - 1 ][ 2 ] ) ```
评论 0

发表评论 取消回复

Shift+Enter 换行  ·  Enter 发送
还没有评论,来发表第一条吧