代码随想录打卡第五十二天|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]));
    }
}

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没脑袋的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值