• 随想录一刷Day50——动态规划


    Day50_动态规划

    35. 买卖股票的最佳时机 III

    123. 买卖股票的最佳时机 III
    思路:

    1.状态定义: dp[i][j] 表示第i天在状态j下,手上的现金数量,每天有5中可能的状态

    • dp[i][0]表示第i天,没有买卖过股票的现金数
    • dp[i][1]表示第i天,之前或第i天当天买过一次股票,手上的现金数
    • dp[i][2]表示第i天,之前或第i天当天买卖一次股票,手上的现金数
    • dp[i][3]表示第i天,之前或第i天当天买入两次股票,卖出一次,手上的现金数
    • dp[i][4]表示第i天,之前或第i天当天买出两次股票,手上的现金数
    1. 状态转移方程:
    • dp[i][0] = dp[i - 1][0]; // 保持没有买卖过的状态
    • dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]); // 保持之前买过一次的状态或者之前没买过今天买入一次
    • dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]); // 保持之前买卖过一次的状态或者之前买入过一次今天卖出一次
    • dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]); // 保持之前买入两次的状态或者之前买卖过一次今天买入第二次
    • dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); // 保持之前买入两次卖出一次的状态或者之前买入两次今天卖出
    1. 初始化:
    • dp[0][0] = 0;
    • dp[0][1] = -prices[0];
    • dp[0][2] = 0;
    • dp[0][3] = -prices[0];
    • dp[0][4] = 0;
    1. 递推顺序从前往后
    class Solution {
    public:
        int maxProfit(vector<int>& prices) {
            int prices_size = prices.size();
            if (prices_size == 0) return 0;
            vector<vector<int>> dp(prices_size, vector<int>(5, 0));
            dp[0][0] = 0;
            dp[0][1] = -prices[0];
            dp[0][2] = 0;
            dp[0][3] = -prices[0];
            dp[0][4] = 0;
            for (int i = 1; i < prices_size; i++) {
                dp[i][0] = dp[i - 1][0];
                dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
                dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]);
                dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
                dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
            }
            return dp[prices_size - 1][4];
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    36. 买卖股票的最佳时机 IV

    188. 买卖股票的最佳时机 IV
    思路:

    和上一问相同的思路,只不过第二维代表的状态数从5变成了 2*k+1

    class Solution {
    public:
        int maxProfit(int k, vector<int>& prices) {
            int prices_size = prices.size();
            if (prices_size == 0) return 0;
            vector<vector<int>> dp(prices_size, vector<int>(2 * k + 1, 0));
            // 初始化
            for (int j = 1; j <= k; j++) {
                dp[0][2 * j - 1] = -prices[0];
            }
            // dp
            int states_type = 2 * k + 1;
            for (int i = 1; i < prices_size; i++) {
                for (int j = 1; j <= k; j++) {
                    int state_in = 2 * j - 1; // 之前买入的状态
                    int state_out = 2 * j; // 之前卖出的状态
                    dp[i][state_in] = max(dp[i - 1][state_in], dp[i - 1][state_in - 1] - prices[i]);
                    dp[i][state_out] = max(dp[i - 1][state_out], dp[i - 1][state_out - 1] + prices[i]);
                }
            }
            return dp[prices_size - 1][2 * k];
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    rabbitMq安装
    架构——mysql、wiki、jira
    双十一电商流量暴增的背后,用户体验如何保障?
    JavaScript 操作浏览器和HTML文档/JavaScript 操作对象
    ES6 入门教程 6 正则的扩展 6.10 Unicode 属性类 & 6.11 v 修饰符:Unicode 属性类的运算 & 6.12 具名组匹配
    wpf devexpress post 更改数据库
    Linux aarch64交叉编译之 weston窗口管理程序
    [思维][组合数学]Madoka and The Corruption Scheme Codeforces1717D
    字体族与图标字体
    公众号查题接口 不限次数
  • 原文地址:https://blog.csdn.net/zhiai_/article/details/127763091