代码随想录算法训练Day41|121、买卖股票的最佳时机1、122、买卖股票的最佳时机2、123、买卖股票的最佳时机3

121、买卖股票的最佳时机1

dpi0:第i天的时候不持有股票,手头最大金额

dpi1:第i天的时候不持有股票,手头最大金额

递推公式:看注释

初始化:初始化第一天两个状态即可,后面都会更新

遍历顺序:看状态都是由前一个状态推出来的,自然是从前向后

复制代码
class Solution {
    public int maxProfit(int[] prices) {
        int[][] dp = new int[prices.length][2];
        dp[0][0] = 0;
        dp[0][1] = -prices[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],-prices[i]);
        }

        return dp[prices.length -1][0];
    }
}

122、买卖股票的最佳时机2

修改递推公式即可:

当天持有状态 = (前一天持有,前一天不持有-当天价格)的最大值

dpi1 = Math.max(dpi-11, dpi-10 - pricesi);

java 复制代码
class Solution {
    public int maxProfit(int[] prices) {

        /*/贪心算法
        int res = 0;
        for(int i = 1; i < prices.length; i++){
            int wave = prices[i] - prices[i-1];
            if(wave > 0) res += wave;
        }
        return res;
        //*/

        //*/动态规划
        int[][] dp = new int[prices.length][2];
        dp[0][0] = 0;
        dp[0][1] = -prices[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][0];
        //*/
    }
}

123、买卖股票的最佳时机3

数组第二个维度表示: 1第一次持有,2第一次不持有。3第二次持有,4第二次不持有。

状态转移方程很容易能推到出来。需要注意的是初始化的时候可以当天买入当天卖出。

java 复制代码
class Solution {
    public int maxProfit(int[] prices) {
        int[][] dp = new int[prices.length][5];
        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.length; i++){
            //错误示例:每天都把当天当成最佳的第一次持有时机
            //dp[i][1] = -prices[i];
            
            //第i天的时候第一次持有
            dp[i][1] = Math.max(dp[i-1][1], -prices[i]);
            //第i天的时候第一次不持有
            dp[i][2] = Math.max(dp[i-1][2],dp[i-1][1]+prices[i]);
            //第i天的时候第二次持有
            dp[i][3] = Math.max(dp[i-1][3], dp[i-1][2] - prices[i]);
            //第i天的时候第二次不持有
            dp[i][4] = Math.max(dp[i-1][4], dp[i-1][3] + prices[i]);

        
        } 

        return Math.max(dp[prices.length -1][4],dp[prices.length-1][2]);
    }
}
相关推荐
数模竞赛Paid answer14 小时前
2025年中青杯数学建模A题康养城市建设求解全过程论文及程序
算法·数学建模·数据分析·中青杯
网安蟹佬霸14 小时前
密码学安全实战:从加密原理到哈希破解的完整攻防指南
网络·算法·安全·web安全·开源·密码学·哈希算法
yangmu320314 小时前
深度解析:短视频是如何通过“算法+神经机制”劫持用户时间的?
算法
LuminousCPP14 小时前
栈和队列专题(四):LeetCode 232. 用栈实现队列|双栈分工 + 按需迁移 + 摊还 O(1)
c语言·数据结构·笔记·算法·leetcode
tudousisi22214 小时前
01背包8.21
数据结构·算法
ZJU_统一阿萨姆15 小时前
【算子开发】Reduction算子完全指南
人工智能·算法·语言模型
青 春 记 忆15 小时前
LeetCode 155. 最小栈|Python 解法详解
开发语言·python·leetcode
鹿角片ljp1 天前
LeetCode 46. 全排列|吃透回溯
算法·leetcode·职场和发展
鼎艺创新科技1 天前
不依赖 UE/Unity:我们如何从零搭建一套国产三维 GIS 渲染引擎
人工智能·算法·unity·游戏引擎·三维电子沙盘
程序员三藏1 天前
Python+requests实现接口自动化测试
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试