最佳买卖股票时期含冷冻期

题目

Alt

思路

  1. 首先分析题目,具体到每一天的状态有三个维度:买入,卖出,冷冻期,那么可以降为两个维度:持有股票和未持有股票,那么我们就设置两个dp数组,hold_dp[i]表示第i天持有股票的最大利益,nohold_dp[i]表示第i天不持有股票的最大利益
  2. 持有股票有两种情况:(1)昨天就持有,今天不做任何操作,那么hold_dp[i]=hold_dp[i-1](2)前天卖出了,然后在今天买入股票,那么hold_dp[i]=nohold_dp[i-2]-prices[i](这里要说明一下为什么一定要是前天:一开始我也疑问为什么不能是nohold[i-1]而是nohold_dp[i-2],我们要注意一个限制条件是两笔买卖之间要有一个冷冻期,如果选择的是nohold_dp[i-1],那么昨天有可能已经完成了一笔交易,此时不能买入股票),所以hold_dp[i]=max(hold_dp[i-1],nohold_dp[i-2]-prices)
  3. 未持有股票也分两种情况:(1)昨天也未持有,到了今天不做任何操作,那么nohold_dp[i]=nohold_dp[i-1](2)昨天持有,今天卖了,那么nohold_dp[i]=hold_dp[i-1]+prices[i],所以状态转移方程为:nohold_dp[i]=max(nohold_dp[i-1],hold_dp[i-1]+prices[i])

相关代码为:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if (prices.size() < 2)
			return 0;
		int n = prices.size();
		vector<int> hold_dp(n, 0);
		vector<int> nohold_dp(n, 0);
		hold_dp[0] = -prices[0];
		hold_dp[1] = max(hold_dp[0], -prices[1]);
		nohold_dp[1] = max(nohold_dp[0], hold_dp[0] + prices[1]);
		for (int i = 2; i < n; i++) {
			hold_dp[i] = max(hold_dp[i - 1], nohold_dp[i-2] - prices[i]);
			nohold_dp[i] = max(nohold_dp[i - 1], hold_dp[i-1] + prices[i]);
		}
		return nohold_dp[n - 1];
	}
};
发布了67 篇原创文章 · 获赞 0 · 访问量 1381

猜你喜欢

转载自blog.csdn.net/clearLB/article/details/104528528