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

算法练习-day39

时间:2023-08-07 16:32:03浏览次数:59  
标签:day39 int 股票 练习 算法 vector prices 卖出 dp

动态规划

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

题意:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

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

实例:

算法练习-day39_动态规划

思路:由题意可知,我们最多进行两次股票的买卖,两次买卖是存在一定状态关系的。我们第一次买卖所得的钱会影响到第二次买卖的结果,即最终结果。因此我们在创建数组时,需要创建四个状态:0表示第一次买入股票的全部金额,1表示第一次卖出股票的全部金额,2表示第二次买入股票的全部金额,3表示第二次卖出股票的全部金额。第一次买入和卖出的递归公式我们在之前的题目中也给出过,而第二次买入则需要第一次卖出的金额决定,第二次卖出则需要第二次买入觉得,以此类推,代码如下。

C++代码:

    int maxProfit(vector<int>& prices) {
        vector<vector<int>> dp(prices.size(),vector<int>(4));
        //四种状态:0表示不操作,1表示第一次买入,2表示第一次卖出,3表示第二次买入,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.size();i++)
        {
            dp[i][0]=max(dp[i-1][0],-prices[i]);
            dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]);
            dp[i][2]=max(dp[i-1][2],dp[i-1][1]-prices[i]);
            dp[i][3]=max(dp[i-1][3],dp[i-1][2]+prices[i]);
        }
        return dp[prices.size()-1][3];
    }

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

题意:给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。

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

实例:

算法练习-day39_动态规划_02

思路:本题就是对买卖股票这类问题的一个总结。我们从前面的题不难看出,对于只能一次的交易,我们的0表示买入股票后剩余的钱,1表示卖出股票剩余的钱,以此类推,对于k次买卖股票,偶数(包括0)表示买入股票的钱,奇数表示卖出股票的钱,这样我们的数组创建,就有k*2种状态;在递推公式中,我们只需要在使用一次for循环,将状态转移方程以循环的方式实现即可

C++代码:

int maxProfit4(int k, vector<int>& prices) {
	vector<vector<int>> dp(prices.size(), vector<int>(k * 2 + 1));
	//0表示买入,1表示卖出,即偶数表示买入,奇数表示卖出
	for (int i = 1; i < k * 2 + 1; i += 2)
	{
		dp[0][i] = -prices[0];
	}
	for (int i = 1; i < prices.size(); i++)
	{
		for (int j = 0; j <= k * 2 + 1 - 2; j += 2)
		{
			dp[i][j + 1] = max(dp[i - 1][j+1], dp[i - 1][j] - prices[i]);
			dp[i][j + 2] = max(dp[i - 1][j+2], dp[i - 1][j+1] + prices[i]);
		}
	}
	return dp[prices.size() - 1][k * 2];
}

标签:day39,int,股票,练习,算法,vector,prices,卖出,dp
From: https://blog.51cto.com/u_15209404/6995109

相关文章

  • 文心一言 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题目,提交后由系统即时判......
  • 【算法】用c#实现德州扑克卡牌游戏规则
    德州扑克是一种牌类游戏,可多人参与,它的玩法是,玩家每人发两张底牌,桌面依次发5张公共牌,玩家用自己的两张底牌和5张公共牌自由组合,按大小决定胜负。使用c#完成功能Hand()以返回手牌类型和按重要性递减顺序排列的等级列表,用于与同类型的其他手牌进行比较,即最佳手牌。可能的手牌按价......