状态机解决股票问题
<>状态机,将每一天看做一个整体,有四种可能(即状态),分别是第一次买入股票,第二次买入股票,第一次卖掉股票,第二次卖掉股票,买股票时,要在价钱最低的情况下购买,卖股票时,要在价钱最高的时候卖掉股票,这样利润才能达到最大。
1)s1:记录第一次买入股票后剩余的余额
2)s2:记录第一次卖出股票后剩余的余额
3)s3:记录第二次买入股票后剩余的余额
4)s4:记录第二次卖出股票后剩余的余额
代码讲解
<>为什么可以这样做呢?
<>因为第一次的买入会对第一次卖出的利润造成影响,s2又会对第二次买入获得的利润有影响,s3又会对第二次卖出后的利润有影响,所以这是一个层层影响动态变化,而我们要的是利润的总的最大值,所以我们可以采用利润叠加的方式来进行求解。
<>在代码中,我们是否要进行买入要根据前一次的状态进行,如果可以让利润升高,那我们就买入股票,反之则看卖出股票是否会使利润升高;买入股票后s1发生变化,进而导致后续的利润发生连锁的变化,而每一种利润都有其固定的计算方式,会按照其固定的方式进行利润的更新。
<>一些个人的看法:动态规划更像是一种面向过程的方式,通过遍历数组来得到想要的数据;状态机更像是一种面向对象的方式,具体的一天有属于它的买入和卖出的状态,这些状态的更新与前一个‘对象’的输入息息相关(类似于神经网络的反向梯度传播优化权重)。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if len(prices) < 2: return 0
s1 = -prices[0]
s2 = s3 = s4 = float('-inf')
for i in range(1, len(prices)):
s1 = max(s1, -prices[i])
s2 = max(s2, s1 + prices[i])
s3 = max(s3, s2 - prices[i])
s4 = max(s4, s3 + prices[i])
return max(0,s4)
来源:CSDN
作者:hks-忆阳
链接:https://blog.csdn.net/qq_45760401/article/details/104704455