返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言的dp算法LeetCode炒股习题案例分析
  • 926
分享到

C语言的dp算法LeetCode炒股习题案例分析

2023-06-29 04:06:38 926人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“C语言的dp算法LeetCode炒股习题案例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言的dp算法LeetCode炒股习题案例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧

本文小编为大家详细介绍“C语言的dp算法LeetCode炒股习题案例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言的dp算法LeetCode炒股习题案例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

概念

说到动态规划,什么是动态规划?

动态规划(英语:Dynamic programming,简称 dp)通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。

看着这么复杂哈,其实总结出来就是大事化小,拆分成小问题但是这些小问题和原问题是同质的,动规致力于解决每一个子问题,减少计算,其实和递归思想,分治法有些类似,斐波那契数列就可以看做入门级的经典动规问题

这里引用一个网上流行的例子来给大家体会一下:

A :“1+1+1+1+1+1+1+1 =?”
A :“上面等式的值是多少”
B :计算 “8”
A : 在上面等式的左边写上 “1+” 呢?
A : “此时等式的值为多少”
B : 很快得出答案 “9”
A : “你怎么这么快就知道答案了”
A : “只要在8的基础上加1就行了”
A : “所以你不用重新计算,因为你记住了第一个等式的值为8!动态规划算法也可以说是 ‘记住求过的解来节省时间’”

性质

优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理(说人话就是切大瓜,切到最小又不影响我体验)

有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到(说人话就是藕断丝连,拿一个可能带动其他)

无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关(说人话就是把水化成冰,但本质上依然是水)

典型特征

动态规划有4个典型特征:

最优子结构

状态转移方程

边界

重叠子问题

以我们熟悉的斐波那契数列为例

C语言的dp算法LeetCode炒股习题案例分析

f(n-1)和f(n-2) 称为 f(n) 的最优子结构,f(n)= f(n-1)+f(n-2)就称为状态转移方程,f(1) = 1, f(2) = 2 称为边界,其中f(5)= f(4)+f(3),f(4) = f(3) + f(2) ,f(3)就是重叠子问题。

实战论证

要学习dp算法就一定得谈谈 LeetCode 里面的鼻祖题——炒股系列问题,我们就拿例题来港港怎么理解他的典型特征

初始题比较简单,我们以 II 为例:

C语言的dp算法LeetCode炒股习题案例分析

示例:
输入: prices = [7,1,5,3,6,4]
输出: 7

小捷径

看到这里其实最简单的方法已经明了了,那就是贪心算法,只要能赚,只要不赔我就买买买!你说我贪不贪心?

int maxProfit(int* prices, int pricesSize) {    int sum = 0;    for (int i = 1; i < pricesSize; ++i) {        sum += fmax(0, prices[i] - prices[i - 1]);    }    return sum;}

这里用了一个库函数 fmax ,需要引头文件<math.h>,用于比较两个参数的最大值,语法是:

type fmax  (参数1 , 参数2);

再介绍一种我自己用的方法,和贪心原理上差不多,只是用的普普通通的遍历:

int maxProfit(int* prices, int pricesSize) {int n = 0;if (pricesSize == 0){return 0;}int sum = 0;while (n < pricesSize - 1){for (n = 0; n < pricesSize - 1; n++)if (prices[n + 1] - prices[n] > 0)//保证买卖能赚就入手{sum += prices[n+1]-prices[n];}}return sum;}

我自己的方法还是比较优的

C语言的dp算法LeetCode炒股习题案例分析


这样就能一套带走,但我们要用 dp 去搞定他,dp 其实也很简单,只是看着有点复杂,咱不能望而却步是吧。

分析条件,题目中说不能多次买卖,那我们有且只有两种状态就是没有和有一支,没有就是手里为0,又有两种可能就是前一天就是 0 和这一天有一支但被卖出去了;同理,有一支的情况就是前一天就有一支和前一天两手空空但我今天买进了一支。以此我们写出求最大利润的状态转移方程( i 从 0 开始):

第i天有0支股票:dp[i][0] = dp[i-1][0] + dp[i][1]+prices[i];第i天有1支股票:dp[i][1] = dp[i-1][1] + dp[i-1][0]-prices[i];

状态转移方程写出来了,题目就迎刃而解了

算法实现

借助数组或者二维数组,保存每一个子问题的结果,具体创建数组还是二维数组看题目而定,比如找零钱问题中的不同面值零钱与总钱数,这样就需要创建一个二维数组

对应题干条件,具体要求来设置数组边界值,一维数组就是设置第一个数字,二维数组就是设置第一行跟第一列的值

找出状态转换方程,找到每个状态跟他上一个状态的关系,根据状态转化方程就可以写出代码

我们用刚刚推出来的状态转移方程就可以写出整个代码框架

int maxProfit(int* prices, int pricesSize) {    int sz = pricesSize;    int i = 0;    int dp[sz][2] = 0; //sz是最大买卖天数内的价格,2代表两种状态0和1    dp[0][0] = 0,dp[0][1]=-prices[0];//设置边界值    for(i=0;i<sz;i++)    {    dp[i][0] = fmax(dp[i-1][0] + dp[i][1]+prices[i]);    dp[i][1] = fmax(dp[i-1][1] + dp[i-1][0]-prices[i]);//两种状态分别求最大利润    }    return [sz-1][0];  }

优化

我们不难发现,我们的收益只和股票前一天的价格挂钩,和更早的状态没有关系,那我们为了减小时间复杂度和空间复杂度,可以将二维数组转化成一维滚动数组搞定

int maxProfit(int* prices, int pricesSize) {    int dp[pricesSize][2];    int dp0 = 0;dp1 = -prices[0];    for (int i = 1; i < pricesSize; ++i)     {       int Dp0 = fmax(dp0, dp1+prices[i]);        Dp1 = fmax(dp1, dp0-prices[i]); //同理转换出状态转移方程    }    dp0 = Dp0;    dp1 = Dp1;//滚动更新dp0和dp1    return dp[pricesSize - 1][0];}

读到这里,这篇“C语言的dp算法LeetCode炒股习题案例分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C语言的dp算法LeetCode炒股习题案例分析

本文链接: https://lsjlt.com/news/322540.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言的dp算法LeetCode炒股习题案例分析
    本文小编为大家详细介绍“C语言的dp算法LeetCode炒股习题案例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言的dp算法LeetCode炒股习题案例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-06-29
  • C语言动态规划点杀dp算法LeetCode炒股习题案例解析
    目录概念性质典型特征实战论证算法实现优化概念 说到动态规划,什么是动态规划? 动态规划(英语:Dynamic programming,简称 dp)通过把原问题分解为相对简单的子问题的...
    99+
    2024-04-02
  • c语言排序算法案例分析
    本文小编为大家详细介绍“c语言排序算法案例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“c语言排序算法案例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在归并算法中,合并两个数列需要消耗m+n的空间,排...
    99+
    2023-06-17
  • C语言算法举例分析
    这篇文章主要介绍“C语言算法举例分析”,在日常操作中,相信很多人在C语言算法举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言算法举例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!最近,我一...
    99+
    2023-06-17
  • C语言一维数组算法问题的示例分析
    这篇文章给大家分享的是有关C语言一维数组算法问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。问题1:将数组中的数逆序存放本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放, 再按...
    99+
    2023-06-25
  • C语言排序算法实例分析
    这篇文章主要讲解了“C语言排序算法实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言排序算法实例分析”吧!1、直接插入排序基本思想:当插入第i(i>=1)个元素时,前面的ar...
    99+
    2023-06-29
  • C#算法面试题的示例分析
    这篇文章主要为大家展示了“C#算法面试题的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#算法面试题的示例分析”这篇文章吧。C#算法一道面试题:程序设计: 猫大叫一声,所有的老鼠都开始...
    99+
    2023-06-18
  • C语言运算符的重载实例分析
    本篇内容介绍了“C语言运算符的重载实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!写一个Add函数我们先讨论下面代码,并复习前面的内容...
    99+
    2023-06-26
  • c语言中移位运算符的示例分析
    这篇文章主要介绍c语言中移位运算符的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式编译、处理低级存储...
    99+
    2023-06-15
  • C语言算法的定义及分析详解
    目录算法的定义算法和程序的区别算法程序算法的性质算法的表示算法的分析分析原则常用的复杂性函数算法分析基本法则非递归算法:总结算法的定义 算法是一系列良定义的计算步骤 算法和程序的区别...
    99+
    2024-04-02
  • php算法面试题及答案示例的分析
    这篇文章将为大家详细讲解有关php算法面试题及答案示例的分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、P...
    99+
    2023-06-06
  • c语言中缓冲区问题的示例分析
    这篇文章主要介绍了c语言中缓冲区问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。发现问题你是不是总会出现当你输入的时候(你想的是只输出一个内容),但是最后却输入两...
    99+
    2023-06-25
  • C语言中实现朴素模式匹配算法的示例分析
    这篇文章给大家分享的是有关C语言中实现朴素模式匹配算法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么是字符串的模式匹配?字符串模式匹配:在主串中找到与模式串相同的子串,并返回其所在位置。注意:①...
    99+
    2023-06-15
  • Go 语言实现缓存的接口方案,对 LeetCode 算法题有何帮助?
    随着互联网和移动互联网的迅速发展,数据量越来越大,对于高并发的处理和优化问题,缓存成了一个不可或缺的部分。在 Go 语言中,实现缓存可以通过接口方式进行,这种方式不仅方便了代码的编写和调试,还能够极大地提高程序的可扩展性和可维护性。本文将...
    99+
    2023-11-03
    缓存 接口 leetcode
  • C语言数据结构之算法的时间复杂度实例分析
    这篇文章主要讲解了“C语言数据结构之算法的时间复杂度实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言数据结构之算法的时间复杂度实例分析”吧!1、算法的复杂度算法在编写成可执行程序...
    99+
    2023-06-30
  • C/C++经典算法之约瑟夫问题的示例分析
    这篇文章给大家分享的是有关C/C++经典算法之约瑟夫问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是约瑟夫问题? 约瑟夫问题:n个人围成一圈,初始编号从1~n排列,从约定编号为x的人开...
    99+
    2023-06-20
  • C语言中main()函数参数问题的示例分析
    这篇文章主要介绍了C语言中main()函数参数问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。#include<stdio.h>void m...
    99+
    2023-06-29
  • C语言数据结构经典10大排序算法实例分析
    今天小编给大家分享一下C语言数据结构经典10大排序算法实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、冒泡排序//...
    99+
    2023-06-29
  • LeetCode算法题解:Go语言如何应对分布式系统的挑战?
    随着互联网的快速发展,分布式系统已经成为了现代软件系统的标配。但是,分布式系统的设计和实现是非常具有挑战性的,因为分布式系统需要面对许多复杂的问题,例如数据一致性、容错性、分布式事务等等。在这种情况下,如何使用Go语言来应对分布式系统的挑...
    99+
    2023-09-04
    分布式 http leetcode
  • C语言数据结构与算法图的遍历分析
    这篇文章主要介绍“C语言数据结构与算法图的遍历分析”,在日常操作中,相信很多人在C语言数据结构与算法图的遍历分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言数据结构与算法图的遍历分析”的疑惑有所帮助!...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作