本文主要是介绍代码随想录算法训练营第四十八、四十九天|121. 买卖股票的最佳时机1-4,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
买卖股票的最佳时机I-IV
dp[i][j]中dp数组的含义是在第i天时第j次操作股票的最大利润的状态,当j为0时,表示不对股票进行操作,当j为奇数时,表示买入股票,当j为偶数时,表示卖出股票。
dp[2][3]和dp[2][1]的本质其实是一样的,dp[2][3]表示在第2天买入、卖出、再买入,与dp[2][1]的买入是相同的(同一天一次买入和一次卖出相互抵消)
再考虑dp的递推公式。考虑递推公式时,dp[i][j]的推导需要前一天的数据(dp[i-1][j]),其中
如果第i天没有做任何操作的话,直接引用前一天的数据就行了
如果第i天做了操作,那么就是在前一天的基础上(dp[i-1][j-1])再进行一次操作。
这里如果有一天连续做了多次操作怎么处理,递推公式中仅仅考虑了一天做了一次操作(j-1)
如果我一天做了多次操作推导公式还成立吗
首先如果在一天内进行了2的倍数次操作,那么没有影响(买入和卖出抵消了),而且还浪费有限的操作次数
一天内如果进行的是3、5次操作,根据因为卖出和买入抵消,所以奇数次操作本质上就是1次操作。
这里就可以理解了,我们只需要考虑dp[i-1][j],就已经覆盖率在第i天进行操作的所有情况了。
接下来是初始值
dp[0][0]很容易想到是0,i=0表示是第0天(的股票价格),j=0表示还没有进行操作,收益自然是0
dp[0][1]表示在第0天买入股票,所以消耗了prices[0]的钱
所以dp[0][1]=-price[0]
由于奇数偶数(上文中提到了),可以把dp[0][j]的所有情况进行初始化
这篇关于代码随想录算法训练营第四十八、四十九天|121. 买卖股票的最佳时机1-4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!