第六天

家住魔仙堡 提交于 2020-03-07 07:03:34

在这里插入图片描述

状态机解决股票问题
<>状态机,将每一天看做一个整体,有四种可能(即状态),分别是第一次买入股票,第二次买入股票,第一次卖掉股票,第二次卖掉股票,买股票时,要在价钱最低的情况下购买,卖股票时,要在价钱最高的时候卖掉股票,这样利润才能达到最大。
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)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!