【LeetCode 动态规划】买卖股票的最佳时机问题合集

1. 买卖股票的最佳时机含冷冻期

题目链接🔗
在这里插入图片描述


  • 🍎题目思路:
    在这里插入图片描述

在这里插入图片描述


  • 🍎题目代码:
class Solution {
public:
    int maxProfit(vector<int>& prices) {

        int n = prices.size();

        vector<vector<int>> dp(n + 1, vector(3, 0));

        dp[0][0] = 0, dp[0][1] = -prices[0], dp[0][2] = 0;

        for (int i = 1; i < n; i ++)
        {
            
            // 第 i 天结束后处于冷冻期
            dp[i][0] = dp[i - 1][1] + prices[i];
            // 处于 买入
            dp[i][1] = max(dp[i - 1][2] - prices[i], dp[i - 1][1]);
            // 处于 可交易
            dp[i][2] = max(dp[i - 1][0], dp[i - 1][2]);
        }

        return max(dp[n - 1][0], dp[n - 1][2]);


    }
};



2. 买卖股票的最佳时机Ⅳ ---- 只允许交易 k 次🖊

题目链接🔗
在这里插入图片描述


  • 🍎题目思路:
    在这里插入图片描述

在这里插入图片描述


  • 🍎题目代码:
class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {

        int n = prices.size();

        vector<vector<int>> f(n + 1, vector(k + 1, 0)); // 第 i 天结束后, 处于 买入状态
        vector<vector<int>> g(n + 1, vector(k + 1, 0)); // 第 i 天结束后, 处于 卖出状态

		// 初始化 f[][j]、g[][j]  第一天结束后, j 表示交易的次数, 第一天根本就不能完成一次交易
		// 为了避免对后续结果造成影响, 所以将其初始化为 -∞
	
        for (int j = 0; j <= k; j ++)
        {
            f[0][j] = -0x3f3f3f3f;
            g[0][j] = -0x3f3f3f3f;
        }

        // 第 1 天结束后,处于买入状态
        f[0][0] = -prices[0];
        // 第 1 天结束后,处于卖出状态
        g[0][0] = 0;

        for (int i = 1; i < n; i ++)
        {
            for (int j = 0; j <= k; j ++)
            {
                f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]);

                // 小优化:因为 j - 1 会越界
                // g[i][j] = max(g[i - 1][j], f[i - 1][j - 1] + prices[i])
                
                g[i][j] = g[i - 1][j];

                if (j - 1 >= 0)
                    g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i]);
            }
        }

        int ans = g[n - 1][0];
        for (int i = 0; i <= k; i ++)
            ans = max(ans, g[n - 1][i]);

        return ans;

    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小Jie努力认真找工作

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值