解题思路
此处撰写解题思路
状态转移方程 i 第几填,k第几次操作,1买了股票,0没有买股票。 此时的最大profit 买的过程算操作了一次,即买的时候k-1
dp_table[i][k][1] = max(dp_table[i-1][k][1],dp_table[i-1][k-1][0]-prices[i])
dp_table[i][k][0] = max(dp_table[i-1][k][0],dp_table[i-1][k][1]+prices[i])
这里我们k = 1的 时候
dp_table[i][1][1] = max(dp_table[i-1][1][1],dp_table[i-1][0][0]-prices[i])
= max(dp_table[i-1][1][1],0-prices[i]) k=0,不能操作肯定为0啦
dp_table[i][1][0] = max(dp_table[i-1][1][0],dp_table[i-1][1][1]+prices[i])
因为k 都为1,有没有就不重要了,所以都可以去掉。
dp_table[i][1] = max(dp_table[i-1][1],0-prices[i]) k=0,不能操作肯定为0啦
dp_table[i][0] = max(dp_table[i-1][0],dp_table[i-1][1]+prices[i])
最后 记得把 base case dp_table[0][1], dp_table[0][0] 计算好。带入即可解
优化思路: 此刻的状态只需前一个时候的两个状态的值即可。 所以不需要数组存储。记得用一个temp 存上次的值就行:
temp = dp_i_1
dp_i_1 = max(dp_i_1,0-prices[i])
dp_i_0 = max(dp_i_0,temp+prices[i])
当然也记得 base case 先处理。
代码
class Solution:
def maxProfit(self, prices: List[int]) -> int:
'''
状态转移方程
dp_table[i][k][1] = max(dp_table[i-1][k][1],dp_table[i-1][k-1][0]-prices[i])
dp_table[i][k][0] = max(dp_table[i-1][k][0],dp_table[i-1][k][1]+prices[i])
'''
if len(prices) == 0: return 0
n = len(prices)
dp_table = [[0] * 2 for i in range(n)]
for i in range(0,n):
if i == 0:
dp_table[0][1] = -prices[i]
dp_table[0][0] = 0
else:
dp_table[i][1] = max(dp_table[i-1][1],0-prices[i])
dp_table[i][0] = max(dp_table[i-1][0],dp_table[i-1][1]+prices[i])
# print(dp_table)
return dp_table[n-1][0]
### 优化版本:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
'''
状态转移方程
dp_table[i][k][1] = max(dp_table[i-1][k][1],dp_table[i-1][k-1][0]-prices[i])
dp_table[i][k][0] = max(dp_table[i-1][k][0],dp_table[i-1][k][1]+prices[i])
'''
n = len(prices)
if n == 0: return 0
# dp_table = [[0] * 2 for i in range(n)]
for i in range(0,n):
if i == 0:
# dp_table[0][1] = -prices[i]
# dp_table[0][0] = 0
# 节约内存写法:
dp_i_1 = -prices[i]
dp_i_0 = 0
else:
temp = dp_i_1
dp_i_1 = max(dp_i_1,0-prices[i])
dp_i_0 = max(dp_i_0,temp+prices[i])
# print(dp_table)
return dp_i_0