309 最佳买卖股票时机含冷冻期
码农
关注他
1 人赞同了该文章
1.题目描述
给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
- 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
- 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
示例
输入:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
输出: 3
解释:
长度最长的公共子数组是 [3, 2, 1]。
2.题目分析
很明显的一道动态规划问题,首先分析问题,每天都状态有两种,未持有股票dp1和持有股票两种状态dp2,创建两个列表代表两种状态的盈利情况,分析状态转移方程
状态转移方程
首先是当天未持有股票状态dp1,当天未持有股票的话,则分为两种情况:昨天也未持有,或者昨天持有股票,今天卖出。由此得出状态转移方程:
dp1[i] = max(dp[i - 1], dp2[i - 1]+price[i])
然后是当天持有股票状态dp2,当天持有股票的话,则分为两种情况,一是昨天持有股票,今天未卖;二是昨天未持有股票,今天买入。
注意第二种情况,由于存在冷冻期,今天买入则今天一定没有在冷冻期,要确定今天没有在冷冻期,则昨天不能卖出股票,也未持有股票。dp1[i-1] 只能表示昨天没有持有股票,不能表示昨天没有卖出股票,所以要根据前天的状态来确定今天不在冷冻期。
若前天未持有股票的话,则今天一定不再冷冻期。由此可得状态转移方程
dp2[i] = max(dp2[i - 1], dp1[i - 2] - price[i])
同样的由于冷冻期的存在,则若在第一天,第二天(i =1和i=2)时,当天持有股票的利润一定是 0 - price[i],因为之前的时间不足以购买股票
初始条件
dp1 = [0] * len(price) dp2 = [0] * len(price) dp2[0] = - price[0]
非常容易理解,未持有股票的初始条件都是0,若第0天持有股票,则当天的利润为 -price[0]
源代码
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if len(prices) <= 1:
return 0
if len(prices) == 2:
count = prices[1] - prices[0]
return count if count > 0 else 0
n = len(prices)
dp1 = [0] * n
dp2 = [0] * n
dp2[0] = - prices[0]
for i in range(1, n):
dp1[i] = max(dp1[i-1], dp2[i-1] + prices[i])
temp = 0
if i >= 2:
temp = dp1[i-2]
dp2[i] = max(dp2[i-1], temp - prices[i])
return max(dp1[n-1], dp2[n-1])
编辑于 2018-10-07