股票买卖问题-只允许交易1次

问题
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

例如:输入:prices=[7,1,5,3,6,4],输出:5


问题分析
买卖股票,则状态有两种:买入股票,卖出股票。且题目中要求了只能买入一次,卖出一次。

因此定义:
dp[days][2]:第i天,可能赚取的最大利润
dp[i][0]表示第i天不持有股票:前一天手里没有股票,所以不变;前一天持有股票,所以这次卖出去了。
dp[i][1]表示第i天持有股票:前一天本来就持有股票,所以不变;前一天没有股票,所以这次买入股票。

代码

def stock(prices):
    
    if len(prices)<2:
        return 0
    
    dp = [[0]*2 for _ in range(len(prices))]
    #定义dp[i][0]不持有股票     dp[i][1]表示持有股票
    #第1天不可能卖出股票,所以dp[0][0]=0
    #第1天买入股票则,手里的利润为dp[0][1]=-prices[0]   买入股票的钱
    
    for i in range(1,len(prices)):
        #判断是否需要卖出股票,使得利润最大化
        dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i])
        
        dp[i][1] = max(dp[i-1][1],-prices[i]) #判断哪只股票的价格更低,选择选择最低价的股票买入
    
    print(dp)
    
    return dp[len(prices)-1][0] #最终获得卖出股票后,所得的最大利润
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值