动态规划初识心得

今天开始了动态规划算法,经过三道题的洗礼,再加上文档的帮助,我找到了规律(只是从这三道题,并不一定适合所有动态规划)。

比如:509.斐波那契数:对于这道题,一定是要从前向后计算,因为题目中给出的时h[0]=0和h[1]=1,这也相当于知道了规律的前两项,根据题目可以得到h[2]=h[1]+h[0],推导出递推公式h[x]=h[x-1]+h[x-2]。我们需要一个数组

来保存每次计算出的结果,因此可以这么写:

javascript 复制代码
var fib = function (n) {
            let arr = []//设置数组保存每次计算出的结果
            arr[0] = 0, arr[1] = 1//递推公式通过数组实现
            if (n === 0 || n === 1) return n
            for (let i = 2; i <= n; i++) {
                arr[i] = arr[i - 1] + arr[i - 2]
            }
            return arr[arr.length - 1]//返回数组的最后一个元素,
        };
  1. 爬楼梯 :这道题没有明说规律,但是我们可以通过自己的计算来得到。当台阶总数为0,方法只有0种,即h[0]=0;当台阶数为1时,方法有[1]一种,即h[1]=1;当台阶数为2时,方法有[[1,1],[2]]两种,即h[2]=2;当台阶数为3时,方法有[[1,1,1],[1,2],[2,1]]三种,即h[3]=3。由此可以看出这道题的递推公式也是h[x]=h[x-1]+h[x-2]。所以代码与上一道题相同。
  2. 使用最小花费爬楼梯 :这道题相对前两道是比较难的,因为这对找递推公式前两项是非常困难的。但是我们可以想一下,要找到到每一台阶的花费,即需要前一层跳到该层的费用以及跳到前一层的最低花费。写成递推公式就是h[n]=Math.min(h[n-1]+cost[n-1],h[n-2]+cost[n-2])。解释一下:因为每一次可以跳一层或者两层,所以第n层的花费就是前一层跳跃的花费加上跳到前一层的最低花费之和以及前两层跳跃的花费加上跳到前两层的最低花费之和的最小值。代码如下:
javascript 复制代码
        var minCostClimbingStairs = function (cost) {
            let arr = []
            arr[0] = 0, arr[1] = 0//根据上面的递推公式求出数组的前两项
            if (cost.length === 1 || cost.length === 0) return 0
            for (let i = 2; i <= cost.length; i++) {
                arr[i] = Math.min(arr[i - 1] + cost[i - 1], arr[i - 2] + cost[i - 2])
            }
            return arr[arr.length - 1]
        };

以上三道题都是符合开头所说的规则。

相关推荐
闻缺陷则喜何志丹9 分钟前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
Lenyiin27 分钟前
01.02、判定是否互为字符重排
算法·leetcode
鸽鸽程序猿43 分钟前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd43 分钟前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v1 小时前
leetCode43.字符串相乘
java·数据结构·算法
A懿轩A2 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
古希腊掌管学习的神2 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
云边有个稻草人2 小时前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法
半盏茶香2 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法