首页 > 编程语言 >算法练习-day40

算法练习-day40

时间:2023-08-07 18:01:26浏览次数:40  
标签:持有 股票 练习 int 算法 vector prices dp day40

动态规划

309. 买卖股票的最佳时机含冷冻期

题意:给定一个整数数组prices,其中第  prices[i] 表示第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

实例:

算法练习-day40_动态规划

思路:本题可以算是买卖股票2问题的延伸。我们也是可以多次买卖股票并获取最大利润,但是本题我们有四种状态:

  1. 当前持有股票的全部金额
  2. 当前不持有股票且冷冻期已经结束的金额
  3. 当天卖出股票的金额
  4. 冷冻期的金额

这四种状态,分别对应动态规划数组dp的0,1,2,3

首先是初始化,我们将持有股票的状态,即dp[0][0]设置为-prices[0],其他的设置为0;其次是递推公式:

  1. 对于第i天持有股票的状态,我们有三种选择:1.前一天的持有股票状态,2.前一天不持有股票且冻结期已过-当天买入股票,3.冻结期-当天买入股票三种情况的最大值
  2. 对于第i天不持有股票的状态,我们选择前一天不持有股票状态和冻结期状态的最大值进行继承
  3. 对于第i天卖出股票的情况,就一种情况,就是前一天持有股票金额+当天卖出股票金额
  4. 对于第i天冻结金额,就是前一天卖出股票的金额

以上四种递推公式对于上述四种状态,最后我们输出的是后三种情况的最大值。

C++代码:

    int maxProfit(vector<int>& prices) {
        vector<vector<int>> dp(prices.size(),vector<int>(4));
        dp[0][0]=-prices[0],dp[0][1]=0,dp[0][2]=0,dp[0][3]=0;
        for(int i=1;i<prices.size();i++)
        {
            dp[i][0]=max(dp[i-1][0],max(dp[i-1][1]-prices[i],dp[i-1][3]-prices[i]));
            dp[i][1]=max(dp[i-1][1],dp[i-1][3]);
            dp[i][2]=dp[i-1][0]+prices[i];
            dp[i][3]=dp[i-1][2];
        }
        return max(dp[prices.size()-1][1],max(dp[prices.size()-1][2],dp[prices.size()-1][3]));
    }

714. 买卖股票的最佳时机含手续费

题意:给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。

注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

实例:

算法练习-day40_动态规划_02

思路:本题也是买卖股票2的一个简单变种,基本思路都不变。总共有两种状态:持有股票和不持有股票。这个小费问题,我们只需要在每次收钱时,在我们的利润里减去即可,代码几乎没有变化。

C++代码:

    int maxProfit(vector<int>& prices, int fee) {
        vector<vector<int>> dp(prices.size(), vector<int>(2));
        dp[0][0] = -prices[0];
        for (int i = 1; i < prices.size(); i++)
        {
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);
        }
        return dp[prices.size() - 1][1];
    }

标签:持有,股票,练习,int,算法,vector,prices,dp,day40
From: https://blog.51cto.com/u_15209404/6996193

相关文章

  • 算法练习-day39
    动态规划123.买卖股票的最佳时机III题意:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。实例:思路:由题意可知,我们最多......
  • 文心一言 VS 讯飞星火 VS chatgpt (72)-- 算法导论7.1 3题
    三、请简要地证明:在规模为n的子数组上,PARTITION的时间复杂度为Θ(n)。文心一言:首先,我们需要明确PARTITION函数的具体定义。PARTITION函数通常用于快速排序算法中,它将一个数组分为两个子数组,使得一个子数组的所有元素都小于另一个子数组的所有元素。PARTITION函数的基本过程是:1......
  • 算法练习-day38
    动态规划121.买卖股票的最佳时机题意:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中......
  • Redis精通系列——LFU算法详述(Least Frequently Used - 最不经常使用)
    转:Redis精通系列——LFU算法详述(LeastFrequentlyUsed-最不经常使用)  ......
  • 代码随想录算法训练营第十一天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
    20.有效的括号    卡哥建议:讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。 大家先自己思考一下 有哪些不匹配的场景,在看视频 我讲的都有哪些场景,落实到代码其实就容易很多了。   题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%8......
  • 在开源项目中看到一个改良版的雪花算法,现在它是你的了。
    你好呀,我是歪歪。在Seata的官网上看到一篇叫做“关于新版雪花算法的答疑”的文章。http://seata.io/zh-cn/blog/seata-snowflake-explain.html看明白之后,我觉得还是有点意思的,结合自己的理解和代码,加上画几张图,给你拆解一下Seata里面的“改良版雪花算法”。虽然是在Se......
  • Java调度算法实现与应用(FCFS、SJF、RR、HPF)
    文章目录一、调度算法概述二、先来先服务(FCFS)算法1、概述2、Java实现FCFS3、优缺点三、短作业优先(SJF)算法1、概述2、Java实现SJF3、优缺点四、时间片轮转(RR)算法1、概述2、Java实现RR3、优缺点五、优先级调度(HPF)算法1、概述2、Java实现HPF一、调度算法概述调度算法常见于操作系统......
  • 文心一言 VS 讯飞星火 VS chatgpt (69)-- 算法导论6.5 8题
    八、HEAP-DELETE(A,i)操作能够将结点i从堆A中删除。对于一个包含n个元素的堆,请设计一个能够在O(lgn)时间内完成的HEAP-DELETE操作。文心一言:要在O(logn)时间内完成HEAP-DELETE操作,可以使用以下方法:1.首先找到要删除的节点i的父节点。可以从根节点开始,依次向上遍历,直......
  • C语言打卡练习Day4
    1.在一个有序数组中查找具体的某个数字。并将其下标打印出来intmain(){inti=0;intk=5;//要查找的数字intarr[]={1,2,3,4,5,6,7,8,9,10};intnum=sizeof(arr)/sizeof(arr[1]);for(i=0;i<num;i++){if(k==arr[i]){......
  • 计算机算法与程序设计(python) 第一章 编程作业
    计算机算法与程序设计(python)第一章 编程作业查看帮助返回所有测验,作业和考试都在2020年12月30日23点截止,请及时完成。编程作业题可以多次提交,取最高分作为本题成绩。 依照学术诚信条款,我保证此作业是本人独立完成的。温馨提示:1.本次作业属于OnlineJudge题目,提交后由系统即时判......