动态规划——JavaScript

2023-11-07

目录

什么是动态规划

怎么用动态规划

动态规划经典例题

斐波那契数

题目描述

思路

代码

爬楼梯

题目描述

思路

代码

不同路径

题目描述

思路

例题

不同路径Ⅱ

打家劫舍

打家劫舍Ⅱ

买卖股票的最佳时期

买卖股票的最佳时期Ⅱ

使用最小花费爬楼梯

不同的二叉搜索树

整数拆分


什么是动态规划

动态规划(Dynamic Programming),简称DP,是通过把原问题分解成相对简单的子问题的方式求解复杂问题的方法。

简单来说,就是给定一个问题,我们把它拆成一个个子问题,直到子问题可以直接解决。然后把子问题的答案保存起来,以减少重复计算,再根据子问题答案反推,得出原问题解的一种方法。

核心思想:拆分子问题,记住过往,减少重复计算。

适用情况:有重叠子问题和最优子结构性质的问题。

怎么用动态规划

①确定dp数组以及下标的含义;

②确定递推公式;

③初始化dp数组;

④确定遍历顺序;

⑤举例推导dp数组。

动态规划经典例题

斐波那契数

力扣题目链接509. 斐波那契数 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

思路

1、确定dp数组以及下标的含义;

dp[i]定义为:第i个数的斐波那契数值为dp[i]

2、确定递推公式;

状态转移方程(题中已给):

dp[i] = dp[i-1] + dp[i-2];

3、初始化dp数组;

dp[0] = 0;

dp[1] = 1;

4、确定遍历顺序;

由状态转移方程可以看出dp[i]依赖dp[i-1]和dp[i-2],所以遍历顺序是从前到后遍历的。

5、举例推导dp数组。

举例当n=10时,dp数组应该是[0,1,1,2,3,5,8,13,21,34,55]

写完代码后如果结果不对,把dp数组打印出来对照一下。

代码

var fib = function(n) {

    let dp = [];

    dp[0] = 0;

    dp[1] = 1;

    for(let i=2;i<=n;i++){

        dp[i] = dp[i-1]+dp[i-2];

    }

    return dp[n];

};

爬楼梯

力扣题目链接70. 爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

思路

1、确定dp数组以及下标的含义;

定义一个一维数组记录不同楼层的状态,

dp[i]定义为:爬到第i+1层楼梯,由dp[i]种方法。

2、确定递推公式;

一次可以爬1或2个台阶,则dp[i]可以从两个方向推出来:

dp[i-1]:爬到第i层楼梯,共有dp[i-1]种方法,再一次爬1个台阶就是dp[i]了;

dp[i-2]:爬到第i-1层楼梯,共有dp[i-1]种方法,再一次爬2个台阶就是dp[i]了。

那么可以推出:dp[i]就是dp[i-1]与dp[i-2]的和。

状态转移方程:

dp[i] = dp[i-1] + dp[i-2];

3、初始化dp数组;

dp[0] = 1;    //爬到第1层楼梯,1种方法

dp[1] = 2;

4、确定遍历顺序;

由状态转移方程可以看出dp[i]依赖dp[i-1]和dp[i-2],所以遍历顺序是从前到后遍历的。

5、举例推导dp数组。

举例当n=5时,dp数组应该是[1,2,3,5,8]

写完代码后如果结果不对,把dp数组打印出来对照一下。

代码

var climbStairs = function(n) {

    let dp = [];

    dp[0] = 1;

    dp[1] = 1;

    for(let i=2;i<=n;i++){

        dp[i] = dp[i-1]+dp[i-2];

    }

    return dp[n];

};

不同路径

力扣题目链接62. 不同路径 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

思路

1、确定dp数组以及下标的含义;

定义二维数组dp;

dp[i][j]:表示从(0,0)触发,到(i,j)有dp[i][j]条不同路径

2、确定递推公式;

因为机器人每次只能向下或向右走一路,状态转移方程:

dp[i][j] = dp[i-1][j] + dp[i][j-1];

3、初始化dp数组;

dp[i][0]全部初始化为1;

dp[0][j]全部初始化为1;

4、确定遍历顺序;

由状态转移方程可以看出dp[i]是从上边和左边推导而来,所以遍历顺序从左到右从上到下遍历。

5、举例推导dp数组。

举例当m=3,n=7时,dp数组应该是如下图所示。

同样,写完代码后如果结果不对,把dp数组打印出来对照一下。

代码

var uniquePaths = function(m, n) {

    let dp = new Array(m).fill(1).map(()=>new Array(n).fill(1));

    for(let i=1;i<m;i++){

        for(let j=1;j<n;j++){

            dp[i][j] = dp[i-1][j]+dp[i][j-1];

        }

    }

    return dp[m-1][n-1];

};

例题

不同路径Ⅱ

力扣题目链接63. 不同路径 II - 力扣(LeetCode) (leetcode-cn.com)

题目描述

代码

var uniquePathsWithObstacles = function(obstacleGrid) {

    let m = obstacleGrid.length,n = obstacleGrid[0].length;

    let dp = new Array(m).fill(0).map(()=>new Array(n).fill(0));

    for(let i=0;i<m&&obstacleGrid[i][0]===0;i++){

        dp[i][0] = 1;

    }

    for(let i=0;i<n&&obstacleGrid[0][i]===0;i++){

        dp[0][i] = 1;

    }

    for(let i=1;i<m;i++){

        for(let j=1;j<n;j++){

            if(obstacleGrid[i][j]===0)

            dp[i][j] = dp[i-1][j] + dp[i][j-1];

        }

    }

    return dp[m-1][n-1];

};

打家劫舍

力扣题目链接198. 打家劫舍 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

代码

var rob = function(nums) {

    let rob = [];

    rob[0] = nums[0];

    rob[1] = Math.max(nums[0],nums[1]);

    for(let i=2;i<nums.length;i++){

        rob[i] = Math.max(rob[i-2]+nums[i],rob[i-1]);

    }

    return rob[nums.length-1];

};

打家劫舍Ⅱ

力扣题目链接213. 打家劫舍 II - 力扣(LeetCode) (leetcode-cn.com)

题目描述

代码

var rob = function(nums) {

    if(nums.length<2){

        return nums;

    }

    //不偷最后一家

    let rob1 = [],rob2 = [];

    rob1[0] = nums[0];

    rob1[1] = Math.max(nums[0],nums[1]);

    for(let i=2;i<nums.length-1;i++){

        rob1[i] = Math.max(rob1[i-2]+nums[i],rob1[i-1]);

    }

    //不偷第一家

    rob2[1] = nums[1];

    rob2[2] = Math.max(nums[1],nums[2]);

    for(let i=3;i<nums.length;i++){

        rob2[i] = Math.max(rob2[i-2]+nums[i],rob2[i-1]);

    }

    //比较两种情况的偷窃金额

    return Math.max(rob1[nums.length-2],rob2[nums.length-1]);

};

买卖股票的最佳时期

力扣题目链接121. 买卖股票的最佳时机 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

代码

var maxProfit = function(prices) {

    // 动态规划

    let res = 0;

    let pre = 0;

    for(let i=1;i<prices.length;i++){

        let diff = prices[i]-prices[i-1];

        pre = Math.max(pre+diff,0);

        res = Math.max(res,pre);

    }

    return res;

};

买卖股票的最佳时期Ⅱ

力扣题目链接122. 买卖股票的最佳时机 II - 力扣(LeetCode) (leetcode-cn.com)

题目描述

代码

var maxProfit = function(prices) {

    // 动态规划

    let dp = new Array(prices.length).fill([0,0]);

    dp[0] = [-prices[0],0];

    for(let i=1;i<prices.length;i++){

        dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]-prices[i]);

        dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);

    }

    return dp[prices.length-1][1];

    // 贪心

    // let profit = 0;

    // for(let i=1;i<prices.length;i++){

    //     profit += Math.max(0,prices[i]-prices[i-1]);

    // }

    // return profit;

};

使用最小花费爬楼梯

力扣题目链接746. 使用最小花费爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

代码

var minCostClimbingStairs = function(cost) {

    //第0个阶梯最小花费是cost[0],第1个阶梯最小花费是cost[1]

    for(let i=2;i<cost.length;i++){

        cost[i] = Math.min(cost[i-2],cost[i-1])+cost[i];

    }

    return Math.min(cost[cost.length-2],cost[cost.length-1]);

};

不同的二叉搜索树

力扣题目链接96. 不同的二叉搜索树 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

代码

var numTrees = function(n) {

    // 卡特兰数,动态规划

    let dp = new Array(n+1).fill(0);

    dp[0] = 1;

    dp[1] = 1;

    for(let i=2;i<n+1;i++){

        for(let j=1;j<i+1;j++){

            dp[i] += dp[j-1]*dp[i-j];

        }

    }

    return dp[n];

};

整数拆分

力扣题目链接343. 整数拆分 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

代码

var integerBreak = function(n) {

    let dp = new Array(n+1).fill(0);

    dp[1] = 1;

    dp[2] = 1;

    for(let i=3;i<=n;i++){

        // 对于数字i,它可以拆分成两部分——j,i-j

        for(let j=0;j<=i-j;j++){

            // 选择可拆可不拆,拆就是dp[i-1],不拆就是i-j

            dp[i] = Math.max(dp[i],j*dp[i-j],(i-j)*j);

        }

    }

    return dp[n];

};

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

动态规划——JavaScript 的相关文章

  • 基于 Docker 来安装 FastDFS

    文章目录 百度百科 FastDFS 简介 FastDFS 存储策略 上传交互过程 下载交互过程 FastDFS的文件同步 FastDFS 为什么要结合 Nginx 其他资源 FastDFS 安装 环境准备 创建工作目录 docker com
  • Qt 自定义颜色下拉控件

    效果 其实 在这里之前看了许多自定义颜色控件 有的是采用继承QPushButton 点击后 直接弹出 QColorDialog 然后重写 paintEvent 函数 绘制背景为选中的颜色 但是 没有下拉选择颜色的感觉 也有的继承 QComb
  • 微信小程序实战之实现富文本编辑器

    前言 这是我参加掘金启航计划的第三篇文章 这次总结的是实现一个简单的富文本编辑器 相信阅读文章后 观众老爷们 能够实现富文本编辑器 在微信小程序中发布自己的文章 希望观众老爷们多多支持 1 实现效果 实现的效果如下图 1 文本加粗 斜体 下

随机推荐

  • AIX 6.1环境 yum的安装方法

    smit使用方法介绍 因为后面会用到 所以先介绍一下smit的使用方法 输入smitty installp或smitty install 选择Install and Update Software 选择Install Software 在I
  • java打印日志时,如何对字段进行脱敏?

    在我们开发项目的时候 有些字段比较敏感 比如用户信息 这就需要在打印日志的时候对相关字段脱敏处理 本文提供的脱敏方案是使用conversionRule标签的方式 通过继承MessageConverter 在打印日志的时候对相关字段进行脱敏
  • 【RNA-seq】表达矩阵的归一化处理(RPKM,TPM,FPKM,RPM(CPM))

    在RNA seq上游的流程中 所得到的产物为表达矩阵 一般指通过RSEM HTseq等量化工具统计得到的 各个样本比对到参考基因组中各个基因的reads数 一般成为raw read count 这也是最简单的表达定量形式 但是在分析不同样本
  • Linux实现查看文件内容的多种方式

    目录 1 more 分屏显示文件内容 2 less 文本内容查看器 3 head n 显示文件前n行到终端 4 tail n 显示文件后n行到终端 5 实现实时查看文件内容 追踪文件 除了使用vi vim 编辑器查看文件内容和使用cat命令
  • python + selenium 爬淘宝登录

    淘宝的反爬虫机制如果更强大那么该文章方法也没用了 记录于2023 08 07 from selenium import webdriver from selenium webdriver common by import By from s
  • react路由动画跳转,猛练自然强

    react路由动画跳转 1 先在react项目中下载一个css第三方库 用npm或者yarn 第三方库下载 npm install animate css save yarn add animate css 2 在react组件中引用这个c
  • chatgpt赋能python:Python开发的SEO应用

    Python开发的SEO应用 搜索引擎优化 SEO 已经成为每个网站所有者需要考虑的重要因素之一 随着搜索引擎算法的不断变化和演进 我们需要确保我们的网站能在各种搜索引擎中进行良好的排名 Python作为一门强大的编程语言 已经被广泛用于S
  • linux centos 7 恶搞不停重启以及问题解决

    centos 7 恶搞不停重启以及问题解决 一 基础知识 1 运行级别的介绍 首先 CentOS系统有7个运行级别 runlevel 如下 运行级别0 系统停机状态 系统默认运行级别不能设为0 否则不能正常启动 运行级别1 单用户工作状态
  • ADB 用法大全

    基本用法 命令语法 adb 命令的基本语法如下 adb d e s
  • Java时间操作定义类

    类描述 时间操作定义类 public class DateUtils extends PropertyEditorSupport 各种时间格式 public static final SimpleDateFormat date sdf ne
  • libvirt安装过程

    libvirt安装过程 下载libvirt 0 8 1 tar gz 解压该文件 tar zxvf libvirt 0 8 1 tar gz 解压完成后进入到文件夹 libvirt 0 8 1开始安装 1 configure 2 此时提示缺
  • 笔记本电脑无法连接网络并在网络状态中显示ipv4和ipv6无网络访问权限

    win10电脑连不上网首先先右键无线或者网线那个图标 然后点击打开网络和共享中心 找到并点击连接 进入以太网或者wifi状态 看ipv4连接后面是否显示的是无网络访问权限 如果是 请按以下步骤操作 在桌面按WIN R输入CMD点击确定 打开
  • Docker部署Canal

    Canal Canal是阿里开源的一款基于Mysql数据库binlog的增量订阅和消费组件 通过它可以订阅数据库的binlog日志 然后进行一些数据消费 如数据镜像 数据异构 数据索引 缓存更新等 相对于消息队列 通过这种机制可以实现数据的
  • Windows10+CUDA+Tensorflow-gpu安装。装了一个星期,啥问题都见过了。(eg: ImportError: DLL load failed)

    目录 1 CUDA 卸载 2 中间出现的问题 2 1 问题1 This graphics driver could not find compatible graphics hardware You may continue install
  • 畸形报文单包攻击检测防御原理

    Ping of Death攻击 路由器对包的大小是有限制的 IP报文的长度字段为16位 即IP报文的最大长度为65535 如果遇到大小超过65535的报文 会出现内存分配错误 从而使接收方的计算机系统崩溃 攻击者只需不断的通过Ping命令向
  • 源代码中有什么

    在过去 源代码是核心机密 优秀的软件工程师在在某个公司的黑屋子里写程序 我们只能看到发布的产品 但是在今天 开放源代码成为一种开发方式 高手们在开源社区发布他们的代码 我们也终于有机会一睹大师高手们的源程序了 我们可以很容易地从网上下载到各
  • Kubeflow Pipeline - 构建自定义的 Workflow

    文章目录 1 Overview 2 Steps 2 1 理解 component 和 pipeline 2 2 Python SDK 构建 component 和 pipeline 2 3 上传 pipeline 3 Summary 1 O
  • 亮度、对比度与饱和度

    亮度是指图片的明暗程度 对比度是指图片明暗的差异 饱和度则是图片颜色的饱满程度 图片文件一般是RGB格式 当然也有的是YCBR格式 前者主要用于显示 后者则主要用于印刷 当然世上没有绝对的事情 也有人喜欢在电脑或手机上看YCBR格式的 至于
  • 消息队列-msgget

    msgget 获取系统V消息队列标识符 获取消息队列的id 头文件 include
  • 动态规划——JavaScript

    目录 什么是动态规划 怎么用动态规划 动态规划经典例题 斐波那契数 题目描述 思路 代码 爬楼梯 题目描述 思路 代码 不同路径 题目描述 思路 例题 不同路径 打家劫舍 打家劫舍 买卖股票的最佳时期 买卖股票的最佳时期 使用最小花费爬楼梯