股票买卖问题-最多允许交易2次

该博客探讨了一个计算股票交易中两次交易所能获得最大利润的问题。通过分析,确定了在每次交易后只能持有0或1只股票的规则。采用动态规划的方法,定义了买入和卖出股票的不同状态,并描述了状态之间的转移关系。最后,提供了相关的代码实现。
摘要由CSDN通过智能技术生成

问题
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

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


问题分析
最多能完成2笔交易,且不能同时参与多笔交易,则说明一次最多只能持有1只股票,并且卖掉后才能卖第二只股票。

状态:
买入股票:0次持有,1次持有,2次持有
卖出股票:0次持有,1次不持有,2次不持有
并且状态转移关系为:
0买0买–>1持有
0买0买 or 1持有–>1不持有
1不持有–>2持有
1不持有 or 2持有–>2不持有


代码

def stock2(prices):
    #只允许交易两次
    if len(prices)<2:
        return 0
    
    dp = [[[0]*3,[0]*3] for _ in range(len(prices))]
    #定义dp[i][0][j]不持有股票     j表示第几次不持有股票   的最大利润
    #dp[i][1][j]表示持有股票        j表示第几次持有股票       的最大利润 
    #第1天不可能卖出股票,所以dp[0][0]=0
    #第1天买入股票则,手里的利润为dp[0][1][1]=-prices[0]   dp[0][1][2]=-prices[0] 买入股票的钱
    dp[0][1][1] &#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值