题解 | #买卖股票的最好时机#
买卖股票的最好时机
http://www.nowcoder.com/practice/64b4262d4e6d4f6181cd45446a5821ec
python版动态规划题解,更改k适用于任意交易次数
class Solution:
def maxProfit(self,prices):
#适用于任意交易次数,只用于本题可以将k维去掉
len_i=len(prices) #能交易的总天数
k=1 #允许交易的最大次数
len_k=k+1 #如果交易一次,k应该有0和1两个值!!!!!!!!
dp=[[[0]*2 for _ in range(len_k)] for _ in range(len_i)] #dp[交易的第几天][最多交易k次][手里持有或没有持有股票]
#base case
#dp[-1][k][0]=0 还没开始交易的最大利润是0
#dp[-1][k][1]=-float('inf') 还没开始交易手里不可能出现股票
#dp[i][0][0]=0 不允许交易的话最大利润肯定是0
#dp[i][0][1]=-float('inf') 不允许交易手中不可能有股票
#处理basecase
# i=0的情况
for k in range(len_k):
dp[0][k][0]=0
dp[0][k][1]=-prices[0]
#k=0的情况
for i in range(len_i):
dp[i][0][0]=0
dp[i][0][1]=-prices[i]
for i in range(1,len(dp)):
for k in range(1,len(dp[0])):
#第i天手里没有股票的最大利润=max(昨天我就没有,昨天我有我卖了)
dp[i][k][0]=max(dp[i-1][k][0],dp[i-1][k][1]+prices[i])
#第i天手里有股票的最大利润=max(昨天我就有,昨天我没有但是我今天买了)
dp[i][k][1]=max(dp[i-1][k][1],dp[i-1][k-1][0]-prices[i])
print(dp)
return dp[-1][-1][0]
查看12道真题和解析