一、题目解析
二、算法原理
我们可以使用dp[i]来表示第i天买卖股票所获得的最大利润。由题可得我们只能持有一支股票,并且在卖出后有冷冻期的限制,因此我们会有三种不同的状态:
我们目前持有一支股票,对应的「累计最大收益」记为 dp[i][0];
我们目前不持有任何股票,并且处于冷冻期中,对应的「累计最大收益」记为 dp[i][1];
我们目前不持有任何股票,并且不处于冷冻期中,对应的「累计最大收益」记为 dp[i][2]。
对于 dp[i][0],我们目前持有的这一支股票可以是在第 i−1 天就已经持有的,对应的状态为 dp[i−1][0];或者是第 i 天买入的,那么第 i−1 天就不能持有股票并且不处于冷冻期中,对应的状态为 dp[i−1][2] 加上买入股票的负收益 prices[i]。因此状态转移方程为:
dp[i][0]=max(dp[i−1][0],dp[i−1][2]−prices[i])
对于 dp[i][1],我们在第 i 天结束之后处于冷冻期的原因是在当天卖出了股票,那么说明在第 i−1 天时我们必须持有一支股票,对应的状态为 dp[i−1][0] 加上卖出股票的正收益 prices[i]。因此状态转移方程为:
dp[i][1]=dp[i−1][0]+prices[i]
对于 dp[i][2],我们在第 i 天结束之后不持有任何股票并且不处于冷冻期,说明当天没有进行任何操作,即第 i−1 天时不持有任何股票:如果处于冷冻期,对应的状态为 f[i−1][1];如果不处于冷冻期,对应的状态为 dp[i−1][2]。因此状态转移方程为:
dp[i][2]=max(dp[i−1][1],dp[i−1][2])
由于我们要想所获利润最大化则最后一天后一定不持有股票则 max(dp[n-1][1],dp[n-1][2])即为所求。
三、代码解析