代码随想录算法训练营29期|day54 任务以及具体安排

第九章 动态规划part11

  • 123.买卖股票的最佳时机III

    java 复制代码
    // 版本一
    class Solution {
        public int maxProfit(int[] prices) {
            int len = prices.length;
            // 边界判断, 题目中 length >= 1, 所以可省去
            if (prices.length == 0) return 0;
    
            /*
             * 定义 5 种状态:
             * 0: 没有操作, 1: 第一次买入, 2: 第一次卖出, 3: 第二次买入, 4: 第二次卖出
             */
            int[][] dp = new int[len][5];
            dp[0][1] = -prices[0];
            // 初始化第二次买入的状态是确保 最后结果是最多两次买卖的最大利润
            dp[0][3] = -prices[0];
    
            for (int i = 1; i < len; i++) {
                dp[i][1] = Math.max(dp[i - 1][1], -prices[i]);
                dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i]);
                dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
                dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
            }
    
            return dp[len - 1][4];
        }
    }

    思路:于上两个股票买卖问题的区别在于这道题限制了买卖次数,需要定义五种状态:0、1、2、3、4来代表不同的状态。然后使用递推公式对dp数组进行更新。

  • 188.买卖股票的最佳时机IV

    java 复制代码
    // 版本一: 三维 dp数组
    class Solution {
        public int maxProfit(int k, int[] prices) {
            if (prices.length == 0) return 0;
    
            // [天数][交易次数][是否持有股票]
            int len = prices.length;
            int[][][] dp = new int[len][k + 1][2];
            
            // dp数组初始化
            // 初始化所有的交易次数是为确保 最后结果是最多 k 次买卖的最大利润
            for (int i = 0; i <= k; i++) {
                dp[0][i][1] = -prices[0];
            }
    
            for (int i = 1; i < len; i++) {
                for (int j = 1; j <= k; j++) {
                    // dp方程, 0表示不持有/卖出, 1表示持有/买入
                    dp[i][j][0] = Math.max(dp[i - 1][j][0], dp[i - 1][j][1] + prices[i]);
                    dp[i][j][1] = Math.max(dp[i - 1][j][1], dp[i - 1][j - 1][0] - prices[i]);
                }
            }
            return dp[len - 1][k][0];
        }
    }
    
    // 版本二: 二维 dp数组
    class Solution {
        public int maxProfit(int k, int[] prices) {
            if (prices.length == 0) return 0;
    
            // [天数][股票状态]
            // 股票状态: 奇数表示第 k 次交易持有/买入, 偶数表示第 k 次交易不持有/卖出, 0 表示没有操作
            int len = prices.length;
            int[][] dp = new int[len][k*2 + 1];
            
            // dp数组的初始化, 与版本一同理
            for (int i = 1; i < k*2; i += 2) {
                dp[0][i] = -prices[0];
            }
    
            for (int i = 1; i < len; i++) {
                for (int j = 0; j < k*2 - 1; j += 2) {
                    dp[i][j + 1] = Math.max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);
                    dp[i][j + 2] = Math.max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);
                }
            }
            return dp[len - 1][k*2];
        }
    }

    思路:该题与上题的区别在于该题是至多能k次,所以二维数组需要2*k+1的维度,1、3、5等奇数代表持有股票,2、4、6等偶数代表不持有股票。然后根据递推公式进行遍历递推。再进行dp数组的初始化。

相关推荐
是未才10 分钟前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio37 分钟前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
罗西的思考1 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX2 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
萧瑟余晖2 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
爱跳舞的烤冷面2 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号2 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽3 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI3 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
MC皮蛋侠客4 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis