欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第六天

程序员文章站 2022-03-06 12:26:57
...

第六天

状态机解决股票问题
<>状态机,将每一天看做一个整体,有四种可能(即状态),分别是第一次买入股票,第二次买入股票,第一次卖掉股票,第二次卖掉股票,买股票时,要在价钱最低的情况下购买,卖股票时,要在价钱最高的时候卖掉股票,这样利润才能达到最大。
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)
相关标签: 笔记