问题
给定一个数组 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] #最终获得卖出股票后,所得的最大利润