• 代码随想录打卡第五十二天|123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV


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

    题目:
    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成两笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)
    在这里插入图片描述
    在这里插入图片描述

    题目链接: 123.买卖股票的最佳时机III
    注:不同状态转换的关系
    持有第一支股票:之前不持有,现买入第一支股票;一直持有
    不持有第一支股票:之前不持有(没买入 没进行操作);之前持有,现卖出
    持有第二支股票:再卖出第一支股票之后,一直未操作,现买入第二支股票;一直持有
    不持有第二支股票:之前不持有(没买入 没进行操作);之前持有,现卖出
    注意第一次股票买卖和第二次的关联关系

    class Solution {
        //设四个变量
        //dp[n][0] 持有第一支股票
        //dp[n][1] 不持有第一只股票
        //dp[n][2] 持有第二支股票 它的前一个状态是不持有第一支股票 因为只有卖掉第一支才能买第二支
        //dp[n][3] 不持有第二只股票
        public int maxProfit(int[] prices) {
            int n=prices.length;
            int[][] dp=new int[n+1][4];
            //初始化
            dp[1][0]=-prices[0];
            dp[1][1]=0;
            dp[1][2]=-prices[0];
            dp[1][3]=0;
            for(int i=2;i<=n;i++){
                //第一次买入 本金是0
                dp[i][0]=Math.max(dp[i-1][0],-prices[i-1]);
                dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i-1]);
                dp[i][2]=Math.max(dp[i-1][2],dp[i-1][1]-prices[i-1]);
                dp[i][3]=Math.max(dp[i-1][3],dp[i-1][2]+prices[i-1]);
            }
            return Math.max(Math.max(dp[n][0],dp[n][2]),Math.max(dp[n][1],dp[n][3]));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

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

    题目:
    给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。
    设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。
    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
    在这里插入图片描述
    在这里插入图片描述
    题目链接: 188.买卖股票的最佳时机IV
    把上一次的两次改成多次即可

    class Solution {
        public int maxProfit(int k, int[] prices) {
            int n=prices.length;
            int[][] dp=new int[n+1][2*k];
            //初始化
            for(int j=0;j<k*2;j++){
                if(j%2==0){
                    dp[1][j]=-prices[0];
                }else{
                    dp[1][j]=0;
                }
            }
            for(int i=2;i<=n;i++){
                //第一次买入 本金是0
                dp[i][0]=Math.max(dp[i-1][0],-prices[i-1]);
                dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i-1]);
                for(int j=2;j<k*2;j++){
                    if(j%2==0){
                        dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-1]-prices[i-1]);
                    }else{
                        dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-1]+prices[i-1]);
                    }
                }
            }
            int max=Integer.MIN_VALUE;
            for(int j=0;j<k*2;j++){
                if(dp[n][j]>max){
                    max=dp[n][j];
                }
            }
            return max;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
  • 相关阅读:
    ACCESS实例2 资料管理4——资料管理的报表
    Linux:kubernetes(k8s)有状态的服务部署(14)
    2022年运动品牌推荐,双十一运动装备推荐
    opengl函数加载和错误处理
    计算机毕业设计Java校园新闻网站(系统+源码+mysql数据库+lw文档)
    const和readonly的区别
    3分钟裁员1000+人!IBM中国研发部确认关闭,提供N+3赔偿
    I/O模型和BIO
    About Critical Values
    Oracle基础之单表查询
  • 原文地址:https://blog.csdn.net/weixin_44925329/article/details/134068595