算法学习day41-动态规划

买卖股票

核心思路

  • 这道题的核心思路是动态规划,定义一个二维数组 dp[i][j],其中 i 表示第 i 天,j 表示是否持有股票(0 表示持有,1
    表示不持有)。通过状态转移方程来更新这个数组,从而得到最大利润。
  • 状态转移方程如下:
    • dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i]):第 i 天持有股票的最大利润
      • 有两个推导逻辑
        1. i-1 天已经持有股票,那么第 i 天继续持有,利润不变,即 dp[i-1][0]
        2. i-1 天不持有股票,那么第 i 天买入股票,利润变为 -prices[i]
    • dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]):第 i 天不持有股票的最大利润
      • 有两个推导逻辑
        1. i-1 天已经不持有股票,那么第 i 天继续不持有,利润不变,即 dp[i-1][1]
        2. i-1 天持有股票,那么第 i 天卖出股票,利润变为 dp[i-1][0] + prices[i]
  • 最终答案是 dp[n-1][1],即最后一天不持有股票的最大利润。

代码实现

java 复制代码
public static int maxProfit(int[] prices) {
    //dp[i][0]: 下标为i的时候, 持有股票 赚的钱
    //持有股票: 要么i-1就已经持有了, 要么i买入
    //dp[i][1]: 下标为i的时候, 未持有, 那就延续i-1的, 如果持有, 就卖掉, 就是i-1[0] - price[i]
    //
    int[][] dp = new int[prices.length][2];
    dp[0][0] = -prices[0];
    dp[0][1] = 0;
    for (int i = 1; i < prices.length; i++) {
        dp[i][0] = Math.max(dp[i - 1][0], -prices[i]);
        dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
    }
    return Math.max(dp[prices.length - 1][0], dp[prices.length - 1][1]);
}

买卖股票2

核心思路

  • 同买卖股票逻辑
  • 只是当计算持有的时候, 如果选择买入当天的, 需要用i-11减去i, 因为昨天是有可能有利润的
java 复制代码
    public static int maxProfit1(int[] prices) {
    int[][] dp = new int[prices.length][2];
    dp[0][0] = -prices[0];
    dp[0][1] = 0;
    for (int i = 1; i < prices.length; i++) {
        dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
        dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
    }
    return dp[prices.length - 1][1];
}

买卖股票3

核心思路

  • 这道题可以买卖两次
    • 总结一下, 每天一共有4种状态
      1. 第一次持有或买进
      2. 第一次未持有或卖出
      3. 第二次持有或买进
      4. 第二次未持有或卖出
    • 递推dp
    • dp[i][0]
      • 如果当天未买入, 那就延续i-1[0]的值
      • 如果当天买入了, 那值就是 - price[i]
      • 取最大值
    • dp[i][1]
      • 如果当天未卖出, 那就延续i-1[1]的值
      • 如果当天卖出了, 那值就= i-1[0] + price[i]
    • dp[i][2]
      • 如果当天未买入, 那就延续i-1[2]的值
      • 如果当天买入了, 那值就是[i-1][1] - price[i]
    • dp[i][3]
      • 如果当天未买入, 那就延续i-1[3]的值
      • 如果当天卖出了, 那值就是[i-1][2] + price[i]
java 复制代码
public static int maxProfit2(int[] prices) {
    int[][] dp = new int[prices.length][4];
    dp[0][0] = -prices[0];
    dp[0][1] = 0;
    dp[0][2] = -prices[0];
    dp[0][3] = 0;
    for (int i = 1; i < prices.length; i++) {
        dp[i][0] = Math.max(dp[i - 1][0], -prices[i]);
        dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + 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]);
    }
    return dp[prices.length - 1][3];
}
相关推荐
_李小白1 分钟前
【AI大模型学习笔记之平台篇】第五篇:Trae常用模型介绍与性能对比
人工智能·笔记·学习
承渊政道20 分钟前
【优选算法】(实战体会位运算的逻辑思维)
数据结构·c++·笔记·学习·算法·leetcode·visual studio
Frostnova丶33 分钟前
LeetCode 2573. 找出对应 LCP 矩阵的字符串
算法·leetcode·矩阵
AI-Ming42 分钟前
程序员转行学习 AI 大模型: 踩坑记录:服务器内存不够,程序被killed
服务器·人工智能·python·gpt·深度学习·学习·agi
m0_716765231 小时前
C++提高编程--STL常用容器(set/multiset、map/multimap容器)详解
java·开发语言·c++·经验分享·学习·青少年编程·visual studio
2501_945318491 小时前
零基础学习AI的选型指南:CAIE认证与编程型AI认证如何取舍
人工智能·学习
承渊政道1 小时前
【优选算法】(实战推演模拟算法的蕴含深意)
数据结构·c++·笔记·学习·算法·leetcode·排序算法
林鸿群1 小时前
实现支持纳秒级精度的时间引擎(C++)
算法·定时引擎
Keep learning!1 小时前
PCA主成分分析学习
学习·算法
专注VB编程开发20年1 小时前
CUDA实现随机切割算法,显卡多线程计算
算法·cuda