JavaScript 算法系列---动态规划

2023-10-29

很久之前接触过这样一道题目,总共有十层阶梯,从1层开始往上爬,每次可以上1层或者2层,问到10层总共有多少种方法?

思路:这个问题就是动态规划的一个经典例子,所谓动态规划,就是把复杂的问题进行拆解,拆解成一个个子问题,而这类问题最后非常适合使用递归来解决。诸如这道题目,可以记到某层阶梯的走法为F(n),那么到10层阶梯就是F(10)。 那么F(10)等于什么呢,这里进行假设,如果只差最后一次就可以走到10层,那么此时有几种情况呢?

  1. 在9层,往上走1步即可。
  2. 在8层,往上走2步即可。

那么此时可以得出F(10)=F(9)+F(8); — 最优子结构

其实这里就可以得出F(n)=F(n-1) + F(n-2) — 状态转移方程

而当n=2时,也就是走上2层,马上可以知道只有2种方法(0->2,0->1->2)
也就是F(2)=2,同理F(1)=1. — 边界情况

写成代码也很容易,这里就不写了。


然后这次还遇到了一个类似的题目,源自力扣
链接
其实大致的思路还是一样的,只是增加了对二维数组中,某一个数字的判断逻辑,刚刚开始我是这样做的

/**
 * @param {number[][]} obstacleGrid
 * @return {number}
 */
var uniquePathsWithObstacles = function(obstacleGrid) {
    // 坐标轴向下为x轴,向右为y轴
    // obstacleGrid的数组长度为n,表示矩阵高度
    // 其中每个元素的长度都是m,表示矩阵宽度

    var map = new Map();
    
    var F = function (x,y){
        // x,y 分别为网格的纵坐标.横坐标
        /* 0=<x<=n-1 */
        /* 0=<y<=m-1 */

        if (x ===0 && y === 0) {
            return obstacleGrid[x][y]==0 ? 1:0;
        }

         if (obstacleGrid[x][y] === 1){
            return 0;
        } else {
            if (x === 0) {
                return F(x,y-1);
            } else if (y === 0) {
                return F(x-1,y);
            } else {
                return F(x-1,y) + F(x,y-1);
            }
        }
    }

    return F(obstacleGrid.length - 1,obstacleGrid[0].length - 1);
};

但是某一个测试用例却显示超时了,所以这里得做一些额外的处理,我的思路是对某些计算的结果做一下缓存,每一次执行F(n)时先去Map里面取,如果取不到再进行递归运算,并缓存下来。改动后的代码如下

/**
 * @param {number[][]} obstacleGrid
 * @return {number}
 */


var uniquePathsWithObstacles = function(obstacleGrid) {
    // 坐标轴向下为x轴,向右为y轴
    // obstacleGrid的数组长度为n,表示矩阵高度
    // 其中每个元素的长度都是m,表示矩阵宽度

    var map = new Map();

    var cacheCalc = function (x,y) {
        if (map.has([x,y].join(','))) return map.get([x,y].join(','));
        else {
            var cacheValue = F(x,y);
            map.set([x,y].join(','),cacheValue);
            return cacheValue;
        }
    }

    var F = function (x,y){
        // x,y 分别为网格的纵坐标.横坐标
        /* 0=<x<=n-1 */
        /* 0=<y<=m-1 */

        if (x ===0 && y === 0) {
            return obstacleGrid[x][y]==0 ? 1:0;
        }

         if (obstacleGrid[x][y] === 1){
            return 0;
        } else {
            if (x === 0) {
                return cacheCalc(x,y-1);
            } else if (y === 0) {
                return cacheCalc(x-1,y);
            } else {
                return cacheCalc(x-1,y) + cacheCalc(x,y-1);
            }
        }
    }

    return F(obstacleGrid.length - 1,obstacleGrid[0].length - 1);
};

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 算法系列---动态规划 的相关文章

  • 标准的遗传算法求函数最大值

    最近看了下遗传算法 刚看了一点 就觉得手痒 非要把程序编制出来看看效果 我现在总认为那些理论再高深 无法用计算机实现就是空话 呵呵 下面是我调试了好久的代码 无赖没有学过数据结构 算法 程序写的很差 单效果还是出来了 高兴 和大家共同分享下
  • 动态规划系列之「最长递增子序列的个数」

    673 最长递增子序列的个数 给定一个未排序的整数数组 找到最长递增子序列的个数 示例 1 输入 1 3 5 4 7 输出 2 解释 有两个最长递增子序列 分别是 1 3 4 7 和 1 3 5 7 示例 2 输入 2 2 2 2 2 输出
  • JavaScript 算法系列---动态规划

    很久之前接触过这样一道题目 总共有十层阶梯 从1层开始往上爬 每次可以上1层或者2层 问到10层总共有多少种方法 思路 这个问题就是动态规划的一个经典例子 所谓动态规划 就是把复杂的问题进行拆解 拆解成一个个子问题 而这类问题最后非常适合使
  • 数据结构-二叉排序树(图文详细版)

    文章目录 前言 一 二分搜索树的特性 1 中序遍历的序列是递增的序列 2 中序遍历的下一个节点 称后继节点 即比当前节点大的最小节点 3 中序遍历的前一个节点 称前驱节点 即比当前节点小的最大节点 二 添加节点 1 思路 2 代码实现 三
  • 数据结构与算法:去除重复字母

    给你一个仅包含小写字母的字符串 请你去除字符串中重复的字母 使得每个字母只出现一次 需保证返回结果的字典序最小 要求不能打乱其他字符的相对位置 示例 1 输入 bcabc 输出 abc 示例 2 输入 cbacdcbc 输出 acdb 解题
  • 最短路径(Dijkstra)算法

    目录 一 Dijkstra算法 二 核心思路 三 步骤 四 代码 一 Dijkstra算法 迪杰斯特拉 Dijkstra 算法是由荷兰计算机科学家狄克斯特拉于1959年提出的 是寻找从一个顶点到其余各顶点的最短路径算法 可用来解决最短路径问
  • 【STL详解】stack

    文章目录 前言 一 STL 二 stack 1 stack的创建 2 stack相关方法 3 如何对satck进行排序 前言 本篇文章将总结SLT stack 以及其常用方法 一 STL STL 是 Standard Template Li
  • 数据结构-二分搜索树转双向链表(Java)

    二分搜索树转双向链表 牛客JZ36 题目 思路 1 对二分搜索树进行中序遍历 2 将二分搜索树左节点和根节点相连接 右节点和根节点相连接 遍历左子树 连接 左子树尾部不为空 leftTail right pRootOfTree pRootO
  • 环形链表II

    环形链表II 给定一个链表的头节点 head 返回链表开始入环的第一个节点 如果链表无环 则返回 null 如果链表中有某个节点 可以通过连续跟踪 next 指针再次到达 则链表中存在环 为了表示给定链表中的环 评测系统内部使用整数 pos
  • 【通俗易懂-动态图解析】归并排序、计数排序

    编程TWO 编程小兔崽 今天 归并排序 和选择排序一样 归并排序的性能不受输入数据的影响 但表现比选择排序好的多 因为始终都是O n log n 的时间复杂度 代价是需要额外的内存空间 归并排序是建立在归并操作上的一种有效的排序算法 该算法
  • 【EMC笔试题】N个整数中找出三个数,使其和的绝对值最小

    题目描述 给定包含N个数的无序数组S 可能包含负数 0 正数 求三个数A B C 使其和的绝对值最小 例如 S 9 0 1 3 6 A 9 B 3 C 6 MIN 0 算法解析 解法一 枚举3个数 O N N N 解法二 对S排序后枚举其中
  • 二分查找(Binary Search) 常见问题解决方法总结

    缘由 今天浏览 何登成的技术博客 无意中发现了写的blog 二分查找 Binary Search 需要注意的问题 以及在数据库内核中的实现 随想总结下二分查找的常见问题 问题背景 今年的实习生招聘考试 我出了一道二分查找 Binary Se
  • 【算法】分治、动态规划和贪心算法

    这三种算法非常相似 但是又有一些区别 理解如下 分治 把一个问题划分为若干子问题 求出子问题的最优解 再把子问题的最优解进行merge 最终得到原问题的最优解 动态规划 原问题的最优解包含子问题的最优解 即 拥有最优子结构 同时 求子问题的
  • 【Leetcode刷题笔记之链表篇】142. 环形链表 II

    博客主页 大家好我叫张同学 欢迎点赞 收藏 留言 欢迎讨论 本文由 大家好我叫张同学 原创 首发于 CSDN 精品专栏 不定时更新 数据结构 算法 做题笔记 C语言编程学习 精品文章推荐 C语言进阶学习笔记 三 字符串函数详解 1 爆肝吐血
  • 二叉查找树实现

    package leetcode May import java util ArrayList import java util List description 二叉查找树 author qiangyuecheng date 2022 5
  • 删除链表元素详解版(Java)

    目录 题目 1 一般方法 2 虚拟头节点法 3 递归法 题目 Leetcode203题 移除链表元素 给你一个链表的头节点 head 和一个整数 val 请你删除链表中所有满足 Node val val 的节点 并返回 新的头节点 1 一般
  • 最小生成树总结1 prim算法

    最小生成树总结1 prim算法 最小生成树总结2 kurskal算法 文章目录 1 最小生成树问题概述 2 Prim算法流程 3 模板 4 板子题 1 最小生成树问题概述 给定带权节点网络 从中确定一个包含所有节点 n个 n 1条边 所有节
  • 七大经典排序算法总结【详解】

    排序算法的分类 插入排序 选择排序 交换排序 归并排序 具体分类如图所示 这七种排序算法在我们生活中应用非常广泛 所用的场景各有不同 他的时间复杂度和空间复杂度也是不同的 一 插入排序 初始数据越接近有序 时间效率越高 1 直接插入排序 直
  • 数据结构与算法:KMP模式匹配算

    KMP模式匹配算法原理 如果主串S abcdefgab 其实还可以更长一些 我们就省略掉只保留前9位 我们要匹配的T abcdex 那么如果用BF算法的话 前5个字母 两个串完全相等 直到第6个字母 f 与 x 不等 如图5 7 1的 所示
  • 排列数组使得偶数在奇数的前面

    Name ReorderOddEven c Author 齐保元 Version Copyright Your copyright notice Description Hello World in C Ansi style include

随机推荐

  • 【转】C语言的学习路线

    http topic csdn net u 20110922 08 391f0557 6bbc 490d 8394 b7dede44fa0e html seed 1927482974 r 75671683 r 75671683 UNIX下C
  • Java中判断两个类是否相等

    Java中判断两个类是否相等 当有参数的类生成对象时 当两个对象给的参数相同时 会将第二个对象指向第一个对象的地址 如实例中展示 会输出true public class test1 public static void main Stri
  • GLSL 程序与使用

    核心模式OpenGL GLSL程序 GLSL程序简介和在QT中向GLSL程序变量传递数据 数据类型 包含基本数据类型 int float double uint bool 两种容器类型 向量 Vector 标识符 含义 vecn n个flo
  • 宏任务与微任务

    首先执行顺序 同步任务 gt 异步任务 异步任务又分为 宏任务与微任务 所以整个顺序为 同步任务 gt 微观任务 gt 宏观任务 微观任务大概有Promise then Object observe MutationObserver pro
  • shinelon笔记本进bios设置u盘启动_系统重装U盘启动进BIOS按键查询

    点击蓝字 关注我们 总的来讲 设置电脑从U盘启动一共有两种方法 第一种是开机时候按快捷键然后选择U盘启动 第二种进Bios然后设置U盘 PART ONE 一 U盘启动 组装机主板 品牌笔记本 品牌台式机 主板品牌 启动按键 笔记本品牌 启动
  • WIN32_FIND_DATA、FILETIME、FindFirstFile对文件的操作

    WIN32 FIND DATA FILETIME对文件的操作 include stdafx h include
  • 解决Agora声网音视频在后台没有声音的问题

    前言 本文会介绍 Android 与 iOS 两个平台的处理方式 一 Android高版本在应用退到后台时 系统为了省电会限制应用的后台活动 因此我们需要开启一个前台服务 在前台服务中发送常驻任务栏通知 以此来保证App 退到后台时不会被限
  • 一篇文章看懂Oracle开窗函数

    聚合类开窗函数 聚合类开窗函数类似分组函数group by中的sum avg count max min 等等 但是开窗函数不会像分组聚合函数一样按照分组返回结果 而是有多少行记录就返回多少个结果 结果输出的形式是单独一列进行输出 举个例子
  • mqtt安卓客户端

    1 MQTT 消息队列遥测传输协议 是一种基于 发布 订阅 publish subscribe 模式的 轻量级 通讯协议 该协议构建于TCP IP协议上 MQTT最大优点在于 可以以极少的代码和有限的带宽 为连接远程设备提供实时可靠的消息服
  • 在职场中比能力更重要是什么?

    一个人能力很重要 但是比能力更重要的是一个人的人品 如果一个人的人品有问题 那么很难给予重任 如果只有能力 没有人品 人就会残缺不全 人品决定态度 态度决定行为 行为决定着最后的结果 没有一个公司会愿意重用一个人品欠缺的人 那么比能力更重要
  • 针对Java文档的搜索引擎

    针对Java文档的搜索引擎 项目介绍 项目模块划分及分析 1 索引模块 Parser 类核心业务 Index 核心业务 多线程制作索引 2 搜索模块 分词 生成描述 停用词 3 Web模块 展示 项目介绍 本项目是一个基于SpringBoo
  • CTFshow-菜狗杯-misc(1-6)

    杂项签到 flag直接放入16进制文件 用winhex工具打开直接搜ctfshow就可以了 ctrl F调出搜索框 注意选择ASCII编码 不是unicode 损坏的压缩包 更改文件类型 使用winhex打开 发现是png的格式特征 将文件
  • TASK9 Boosting

    Boosting PAC学习 概率近似正确学习 PAC总结理论 同等条件下 模型越复杂泛化误差越大 同一模型在样本满足一定条件的情况下 其数量越大 模型泛化误差越小 因此还可以说模型越复杂越吃样本 某个训练样本对正确目标的映射 而称为 概念
  • Microsoft Dynamics CRM 2013 试用之系统篇 正式安装 Microsoft Dynamics CRM Server 2013

    想学习Microsoft Dynamics CRM 建议从本人博客CRM中从早到晚日期 完整看一遍 然后再安装 安装需要的文件直接到微软官方下载 1 下载 Microsoft Dynamics CRM Server 2013 2 运行 Se
  • 深度学习语音降噪总结

    实时语音通信发展到今天 用户对通话语音质量提出了越来越高的要求 由于终端设备的多样性以及使用场景的差异 声音问题依然存在 传统的音频处理技术从声音信号本身出发 挖掘其时频特性 作出假设 建立物理模型 很多参数都需要人工进行精细化微调 比较费
  • can only concatenate list (not "str") to list 解决

    我的代码 info item title n item content n 写python代码出现这个提示的时候 can only concatenate list not str to list 该提示字面意思是 只能将list类型和li
  • ubuntu 相关命令记录

    检查ssh 是否可用 ssh 安装curl apt install curl 进入root 进入root 账号 sudo i 修改密码 sodo passwd 开启root 可远程连接 修改SSH配置文件 可以通过SSH配置文件更改包括端口
  • git clone出错问题解决

    一 git clone 报错 错误截图如下 原因分析 可能是数据太大了 http协议不支持 二 改用ssh方式检出代码 第一步 Git Bash工具生成ssh key ssh keygen o t rsa C your email exam
  • 江河湖库水系连通及水美乡村监测系统解决方案

    一 方案背景 随着我国城市规模化的扩张 城市水系统面积萎缩 水生态系统衰退 水环境质量恶化 河道淤塞甚至被侵占为建筑用地等问题日益凸显 河湖水系连通在城市河道治理中占据举足轻重的位置 水系连通及水美乡村建设项目 是水利部 财政部为解决农村水
  • JavaScript 算法系列---动态规划

    很久之前接触过这样一道题目 总共有十层阶梯 从1层开始往上爬 每次可以上1层或者2层 问到10层总共有多少种方法 思路 这个问题就是动态规划的一个经典例子 所谓动态规划 就是把复杂的问题进行拆解 拆解成一个个子问题 而这类问题最后非常适合使