动态规划_股票问题详解

121 买卖股票的最佳时机

描述:给定一个数组 它的第i个元素是一支给定股票第i天的价格
如果你最多只允许完成一笔交易(即买入和卖出一支股票) 设计一个算法来计算你所能获取的最大利润
注意你不能在买入股票前卖出股票

min_p, max_p = 99999999, 0
for i in range(len(prices)):
	min_p = min(min_p, prices[i])
	max_p = max(max_p, prices[i] - min_p)
return max_p

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

描述:给定一个整数数组 其中第i个元素代表了第i天的价格
设计一个算法计算出最大利润 在满足一下约束条件下 你可以尽可能地完成更多的交易(多次买卖一支股票):
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
卖出股票后 你无法在第二天买入股票(即冷冻期为1天)

n = len(prices)
if n == 0:
	return 0
sell = [0 for _ in range(n)]  # 第i天卖出时的最大利润
buy = [0 for _ in range(n)] # 第i天买入时的最大利润
cool = [0 for _ in range(n)] # 第i天冷冻时的最大利润
buy[0] = - prices[0]
for i in range(1, n):
	sell[i] = max(buy[i - 1] + prices[i], sell[i - 1])
	buy[i] = max(cool[i - 1] - prices[i], buy[i - 1])
	cool[i] = sell[i-1]
return sell[-1]

714 买卖股票的最佳时机含手续费

描述:给定一个整数数组prices 其中第i个元素代表了第i天的股票价格 非负整数fee代表了交易股票的手续费用
你可以无限次地完成交易 但是你每次交易都需要付手续费 如果你已经购买了一个股票 在卖出它之前你就不能再继续购买股票了
返回获得利润的最大值

n = len(prices)
if n < 2:
	return 0
dp1 = [0 for _ in range(n)] # 第i天手上有股票时的最大收益
dp2 = [0 for _ in range(n)] # 第i天手上无股票时的最大收益
dp1[0] = -prices[0]
for i in range(1, n):
	dp1[i] = max(dp1[i - 1], dp2[i - 1] - prices[i]) # 第二项表示在第i天买入股票
	dp2[i] = max(dp2[i - 1], dp1[i - 1] + prices[i] - fee) # 第二项表示在第i天将股票卖出
return dp2[n - 1]	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值