动态规划难?读完这篇还不理解那就不要请我吃鸡了

昨天同事说动态规划很难,我说不会啊,理解了就很简单,我同事表示不屑,以为我在炫技。于是乎我问了一个工作六年的前同事,他居然也觉得高大上,并且表示接触过会动态规划的朋友,觉得很牛逼。

我了个天,表示震惊了,简直吓的我瑟瑟发抖发抖好么。既然如此,那我一定要让大家理解,让大家也牛逼牛逼。

以题举例

以中国leetcode(力扣)的121道题《买卖股票的最佳时机》举例,题目如下:

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
复制代码

首先说明一点,在这道题动态规划并不算是高效的算法,这道题即使是暴力法也能比动态规划法要快一些,但本文是为了讲动态规划才讲这道题的,而非为了这道题讲动态规划的。纯粹是这道题讲动态规划更简单。

不了解动态规划的朋友可能不知道,动态规划几乎都是存在套路的,步骤如下:

  1. 将问题拆解成单一问题制表
  2. 根据表中结果进行求解

第一步:将问题拆解成单一问题制表

这是动态规划的重中之重,拆的好坏基本决定你动态规划写的好坏,动态规划更是一种思想。

这道题就很简单了,我们可以把这个问题,先拆成单一问题,即如果我在这天买入,在哪天卖出最高? 我们按题目中的示例 1举例,价格数组为[7,1,5,3,6,4]。

比如我在第一天买入,在哪天卖出最高呢?我们可以得到这样一张表(不能交易标记X):

买入时间买入价格单天价格715364
----卖出时间第一天第二天第三天第四天第五天第六天
第一天7获利程度X-6-2-4-1-3

填表原因如下:

  • 即因为你是第一天买入的,所以第一天不能交易,所以填X
  • 我们第一天买入的,买入价格为7,第二天值1,所以我们卖出则赚了-6.
  • 我们第一天买入的,买入价格为7,第三天值5,所以我们卖出则赚了-2.
  • 我们第一天买入的,买入价格为7,第四天值3,所以我们卖出则赚了-4.
  • 我们第一天买入的,买入价格为7,第五天值6,所以我们卖出则赚了-1.
  • 我们第一天买入的,买入价格为7,第六天值4,所以我们卖出则赚了-3.

有人说这个不是暴力解法么?额,这道题的动态规划的制表过程确实有点像。

那么根据以上规则,如果我们是第二天买入的话,这个表格是不是就是这样的。

买入时间买入价格单天价格715364
----卖出时间第一天第二天第三天第四天第五天第六天
第二天1获利程度XX4253

那么我合并这两张表是不是就是这样的:

买入时间买入价格单天价格715364
----卖出时间第一天第二天第三天第四天第五天第六天
第一天7获利程度X-6-2-4-1-3
第二天1获利程度XX4253

那么我们把这张表弄完整,即把第三天到第五天的买入,那是不是就是这样的。

买入时间买入价格单天价格715364
----卖出时间第一天第二天第三天第四天第五天第六天
第一天7获利程度X-6-2-4-1-3
第二天1获利程度XX4253
第三天5获利程度XXX-21-1
第四天3获利程度XXXX31
第五天6获利程度XXXXX-2
第六天4获利程度XXXXXX

因为第六天买了的话,已经是最后一天了,所以没办法卖了,所以全是X。

第二步:根据表中结果进行求解

上一步,已经把如果是某天买的,每天的获利情况列了一遍,就是拆解成了单一问题。

那么看最大利润,很容易就能看出来了,就看那个数字最大就好了。

买入时间买入价格单天价格715364
----卖出时间第一天第二天第三天第四天第五天第六天
第一天7获利程度X-6-2-4-1-3
第二天1获利程度XX425⃣️3
第三天5获利程度XXX-21-1
第四天3获利程度XXXX31
第五天6获利程度XXXXX-2
第六天4获利程度XXXXXX

没错emoji的5的就是,那么我们只要简单的遍历一下这个表是不是就能把结果取出来了?嗯,对的

最后

但一般来说动态规划的题目不是这么简单的,通常在制表的时候会涉及一个叠加问题,在根据表计算结果一般也不是简单的遍历就能完成的,但理解动态规划思想应该是没什么问题了。

个人认为动态规划虽然性能不强,但是能把问题变得很直观,让人更简单的解决问题。同时算法的杂合度不高,很方便使用分布式为问题的每个单一问题进行求解。

本题代码:best-time-to-buy-and-sell-stock.js

很抱歉,作为AI语言模型,我无法编写完整的游戏代码,但我可以提供一些游戏设计思路和可能用到的C语言知识点。 1. 游戏设计思路 吃鸡游戏是一款生存竞技游戏,玩家需要在一片荒野中生存,寻找资源,制作武器装备,与其他玩家或电脑控制的敌人进行战斗,最终成为最后一名幸存者。 游戏场景:游戏场景采用随机生成地图的方式,玩家可以在地图中自由移动,寻找资源。 资源:游戏中有各种资源,包括武器、弹药、装备、药品等,玩家需要收集这些资源来提高自己的生存能力。 战斗:游戏中的战斗采用实时对战的方式,玩家需要使用武器和装备来对抗其他玩家或敌人。战斗中需要考虑自己的血量、弹药数量、武器类型等因素,制定合理的战术。 胜利条件:游戏中的胜利条件是成为最后一名幸存者,即在所有玩家中作为最后一个活着的人。 2. C语言知识点 游戏开发需要使用多种编程语言和技术,包括C语言。以下是可能用到的C语言知识点: 数据类型:C语言中有多种数据类型,包括整型、浮点型、字符型等,需要根据需要选择合适的数据类型。 数组:数组是一种常用的数据结构,可以用来存储多个同类型的数据。在游戏中,可以使用数组来存储地图、资源、玩家等信息。 结构体:结构体是一种自定义的数据类型,可以用来表示复杂的数据结构。在游戏中,可以使用结构体来表示玩家、敌人、武器、装备等对象。 函数:函数是C语言中的重要概念,可以用来组织代码、提高代码复用性。在游戏中,可以使用函数来处理事件、计算数值、更新状态等。 指针:指针是C语言中的重要概念,可以用来操作内存地址。在游戏中,可以使用指针来动态分配内存、访问数组元素、传递函数参数等。 3. 总结 吃鸡游戏是一款充满挑战和乐趣的游戏,需要多种编程技术的支持。通过学习C语言知识和游戏设计思路,可以开发出更加出色的游戏作品。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值