• 【代码随想录】Day 49 动态规划10 (买卖股票Ⅰ、Ⅱ)


    买卖股票的最佳时机

    https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/
    在这里插入图片描述
    dp[i]表示在第i天时,卖/不卖股票能获得的最大利润:
    1、卖股票:dp[i] = prices[i] -minPrice(i天以前的最低价格)
    2、不卖股票:dp[i] = dp[i-1](因为不卖股票,所以状态和前一天保持一致)
    ∴dp[i] = max(dp[i-1], prices[i] - minPrice);

    class Solution {
    public:
        int maxProfit(vector<int>& prices) {
            int n = prices.size();
            if (n < 2) return 0;
    
            vector<int> dp(n, 0);// dp[i] 表示在第i天结束时的最大利润
            int minPrice = prices[0];
            for (int i = 1; i < n; i++) {
                if (prices[i] < minPrice) minPrice = prices[i];
    
                dp[i]= max(dp[i-1],prices[i] - minPrice);
            }
            return dp.back();
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    买卖股票的最佳时机Ⅱ

    https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/
    在这里插入图片描述
    树形dp类似,多加一个vector存储当前状态:dp[i][0]表示不持有股票,dp[i][1]表示持有股票。每种状态都由dp[i-1][0]和dp[i-1][1]两种状态转移而来,所以dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]):含义是第i天没股票,可能是由于i-1天也没股票,或者是i-1天有股票但是第i天给卖了,对于本来就没股票的情况利润保持一致就行,对于卖掉股票的情况则需要在dp[i-1][1]的利润上加上卖掉股票增加的利润;
    dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i])同理,只不过一个收钱一个花钱罢了。

    class Solution {
    public:
        int maxProfit(vector<int>& prices) {
            int n = prices.size();
            vector<vector<int>> dp (n, vector<int> (2, 0));
            dp[0][1] = -prices[0];
            for (int i = 1; i < n; i++) {
                dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]);
                dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]);
            }
            return max(dp.back()[0], dp.back()[1]);
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    Android 按键流程
    SpringBoot定时任务(一看就会)
    【Java Web】Servlet规范讲解
    ORACLE无法OPEN,处理三板斧
    SQLServer导出数据库字典
    面向对象和面向过程编程的区别
    Jeewx-api 1.4.9版本发布—第三方APP开发SDK,支持微信、钉钉、企业微信、小程序等
    Python函数和模块
    来围观|大佬们都是如何处理风控特征变量池的
    在Jupyter Lab中使用多个环境,及魔法命令简介
  • 原文地址:https://blog.csdn.net/weixin_43785314/article/details/132747022