定义dp[ i ] [ 0 ] 表示第 i + 1 天交易完之后,手里没有股票的最大利润
定义dp[ i ] [ 1 ] 表示第 i + 1 天交易完之后,手里持有股票的最大利润
当天交易完之后,手里没有股票可能有两种情况,一种是当天没有进行任何交易,又因为当天手里没有股票,所以当天没有股票的利润,只能取前一天手里没有股票的利润。
一种是把当天手里的股票给卖了,既然能卖,说明手里是有股票的,所以这个时候,当天没有股票的利润,要取前一天手里有股票的利润,加上当天股票能卖的价格,这两种情况我们取利润最大的即可,所以可以得到
dp[ i ] [ 0 ] = max (dp[ i - 1 ] [ 0 ],dp [ i - 1 ] [ 1 ] + prices [ i ]);
当天交易完之后,手里持有股票也有两种情况,一种是当天没有任何交易,又因为当天手里持有股票,所以当天手里持有的股票,其实在前一天就已经持有了。
还一种是当天买入了股票,当天能卖股票,说明前一天手里肯定是没有股票的,我们取这两者的最大值,所以可以得到
dp[ i ] [ 1 ] = max(dp[ i - 1] [ 1 ],dp[ i - 1 ] [ 0 ] - prices [ i ]);
动态规划的递归公式有了,那么边界条件是什么,就是第一天
如果买入:dp [ 0 ] [ 1 ] = - prices [ 0 ];
如果没买:dp [ 0 ] [ 0 ] = 0
有了递推公式和边界条件,代码很容易就写出来了
def maxProfit(self,prices):
if len(prices) <= 1: return 0
max_profit = 0
min_prices = prices[0]
for i in prices[1:]:
if min_prices < i:
max_profit += i - min_prices
min_prices = i
else:min_prices = i
return max_profit