动态规划法(JavaScript)

2023-11-15

目录

一、动态规划

二、性质

三、典型问题

四、求解的基本步骤

五、案例

1、爬梯子问题

2、最大和的连续子数组


一、动态规划

动态规划(简称DP)的思想是把一个大的问题进行拆分,细分成一个个小的子问题,且能够从这些小的子问题的解当中推导出原问题的解。

二、性质

1、最优子结构性:既所拆分的子问题的解是最优解

2、无后效性:即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策略影响。

3、子问题重叠性质:既在求解的过程当中,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的解题效率。

三、典型问题

1、斐波那契数列

const f = new Array()
function dp(n)
{
    f[1] = 1;f[2] = 1;
    for(let i = 3;i <= n ;i ++)
        f[i] = f[i-1] + f[i-2];
}
console.time('time')  //算法的开始时间
dp(50)
console.timeEnd('time') //算法的结束时间

let str = ""
for(let i=3;i<f.length;i++){
    str += f[i]+"\t"
}
console.log(str)
//输出结果:time: 0.182ms
//2       3       5       8       13      21      34      55      89      144     //233
//377     610     987     1597    2584    4181    6765    10946   17711   28657   46368       //75025   121393  196418  317811  514229  832040  1346269 2178309 3524578 5702887     //9227465 14930352        24157817        39088169        63245986        102334155   //165580141       267914296       433494437       701408733       1134903170 1836311903       //2971215073      4807526976      7778742049      12586269025

四、求解的基本步骤

 动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。 

初始状态→│决策1│→│决策2│→…→│决策n│→结束状态

1、划分阶段按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。

2、确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。

3、确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。

4、寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。

五、案例

1、爬梯子问题

假设你正在爬楼梯,需要 n 阶你才能到达楼顶。每次可以爬1或2阶台阶,可以有多少种不同的方法爬到楼顶

假设,我求5阶台阶有多少种上法;五级台阶可以是走一阶台阶加上四阶台阶的种类,和走二阶台阶加上三阶台阶的种类,这样就是五阶台阶的上法等于四阶台阶的上法加上三阶台阶的上法。

//爬楼梯问题
function climbStairs(n) {
    if (n === 1 || n === 2) {
        return n;
    }

    var ways = [];
    ways[0] = 1;
    ways[1] = 2;
    for(var i=2; i<n; i++){
        ways[i]=ways[i-1] + ways[i-2];
    }
    return ways[n-1];
}
console.log(climbStairs(3));//3

2、最大和的连续子数组

给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大值

示例:输入:[-2,1,-3,4,-1,2,1,-5,4]           输出:6

解释:连续子数组[4,-1,2,1]的和最大为6

function maxSubArray(nums) {    
    let dp = new Array(nums.length);
    //初始化数据
    dp[0] = nums[0];
    let ans = nums[0];

    for(let i = 1; i < nums.length; i ++){
        //获取以nums[i]结尾的最大值
        dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
        //记录最大值
        if(dp[i] > ans) ans = dp[i];
    }
    return ans;
}

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

动态规划法(JavaScript) 的相关文章

  • 提升变量有目的吗?

    我最近学习了很多 JavaScript 并且一直在尝试理解提升变量的值 如果有的话 我 现在 明白JS是一个两遍系统 它编译然后执行 另外 我知道 var 关键字 存在 在它声明的词法范围中 因此如果在引擎为其赋值之前调用它 那么它是 未定
  • 通过纯 JavaScript 获取 div 的第 n 个子元素

    我有一个名为 myDiv 的 div 元素 我怎样才能得到 myDiv 的第n个孩子DOM https en wikipedia org wiki Document Object Model操纵 Markup function reveal
  • Chrome 扩展程序可以相互通信吗?

    我正在编写一个Chrome扩展程序 并且想要实现一个接口或api 以便我将来制作的其他扩展程序可以使用它 最终的效果可能如下 分机 B 呼叫extensionA someMethod someParameters 并向分机A发送一些数据 分
  • Bootstrap 标签栏平滑移动导航按钮

    我有一个用于切换块的普通引导选项卡面板 在导航中切换块时 活动选项卡会突出显示 但现在 当我单击活动选项卡的背景时 它会立即发生变化 是否可以使切换选项卡时背景不会立即改变 而是根据需要哪个选项卡而平滑地左右移动 这可以用以下方法完成吗cs
  • 返回上一页

    我正在使用表格来 评价 页面 此表单将数据 发布 到其他地方的 php 脚本 我只是想在处理表单后显示一个链接 这将使用户返回到上一页 我可以在 php 脚本中使用 javascript 来执行此操作吗 GF 您可以使用链接来调用histo
  • jQuery 可以操作插入的元素吗?

    我是 jQuery 的新手 我认为 jQuery 可以操作由代码添加的元素是合理的 但我发现现在还不能 function addVideo click function publisher append div div
  • React中如何触发同级组件的函数?

    I am new to front end world and could not figure out how to trigger a function from a sibling component Lets say I have
  • Dialogflow Fulfillment Webhook 调用失败

    I am new to dialogflow fulfillment and I am trying to retrieve news from news API based on user questions I followed doc
  • Chrome 开发工具命中代码但未命中断点

    我在 chrome 开发工具上启用了断点 并且在一行上有一个断点 我知道 chrome 正在运行 因为我将断点放在具有以下语句的行上 alert why is this not breaking 如果我在本地主机中找到该文件 则断点有效 断
  • 角度垫排序不适用于带点表示法的 matColumnDef

    我正在尝试按列对表进行排序 当我必须过滤另一个结果中的结果时 就会出现问题 我尝试通过括号表示法和点表示法访问该属性 但没有给出结果 还将最终节点放置在 matColumnDef 中 但失败 因为有 2 列同名 table table
  • 冒泡可用于图像加载事件吗?

    我可以用吗 window addEventListner 某种程度上来说 我所有的图像都有一个display none 图像加载后 我想设置display inline 这样我就可以规范下载图像时显示的内容 在这种情况下 我无法预加载图像
  • jQuery 中什么函数相当于 .SelectMany()?

    让我解释一下 我们知道 jQuery 中的映射函数充当 Select 如 LINQ 中 tr map function return this children first returns 20 tds 现在的问题是我们如何在 jQuery
  • for循环中需要声明变量吗?

    有什么区别 for var i 0 i lt 5 i for i 0 i lt 5 i 是否有必要包含 var 关键字 我知道 var 关键字会影响变量范围 但我无法理解是否有必要在 for 循环中包含该关键字 在第二个示例中 您的变量是全
  • 标记(Markdown)+ Mermaid(流程图和图表)

    努力去争取 美人鱼 https github com knsv mermaid https github com knsv mermaid跟 共事 标记 https github com chjj marked https github c
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • 如何使用 javascript 更改文件扩展名

    有谁知道在 Javascript 中更改文件扩展名的简单方法吗 例如 我有一个带有 first docx 的变量 但我需要将其更改为 first html 这将改变字符串包含文件名 let file first docx file file
  • 使用ExternalInterface和IE从JavaScript获取Flash中的当前URL

    我正在尝试获取 Flash 播放器当前所在的 URL 不是 swf 文件的 URL 而是浏览器指向的 URL 到目前为止我已经使用过 var st String ExternalInterface call window location
  • 使用 File API polyfill 读取数据 URL

    我正在尝试使用文件 API 库 https github com mailru FileAPI https github com mailru FileAPI 作为不支持文件 API 的浏览器的后备 以便将文件作为数据 URL 读取并将其传
  • 如何为 jQuery 插件设置私有变量?

    我想创建一个简单的插件 它使用元素的文本作为默认值 或者您可以在调用插件时设置此值 但是 如果我不设置该值 并为多个元素调用插件 则默认值会成倍增加 function fn reText function options var setti
  • 如何通过点击复制 folium 地图上的标记位置?

    I am able to print the location of a given marker on the map using folium plugins MousePosition class GeoMap def update

随机推荐

  • 几种集中式管理框架比较

    最近因为项目管理上的需要 调研集中式管理工具 百度Disconf 携程Apollo 阿里ACM 三者都可以满足集中式配置 并提供监听 实时改变配置 关于3个框架的使用以及搭建请自行参考官方API文档 不再叙述 对比了3个框架的配置 如下 d
  • 精确时钟同步协议ptp/IEEE-1588v2协议-------(1)简介

    本文目录 1 从角色的角度来区分 2 从时钟类型的角度来区分 2 1 在IEEE 1588 2002中定义了普通时钟 OC ordinary clock 和边界时钟 BC boundary clock 这二种类型的时钟 2 2 在IEEE
  • 【neo4j】win10上利用neo4j-admin导入csv

    原因 我需要导入CN DBpedia到Neo4j中 包含900万 的百科实体以及6700万 的三元组关系 普通逐条插入可能速度太慢 所以要使用neo4j admin命令来进行导入 CN DBpedia原始数据直提供了txt格式的三元组数据
  • java系统增加查找算法详解

    题干 数学老师小y 想写一个成绩查询系统 包含如下指令 insert name score 向系统中插入一条信息 表示名字为name的学生的数学成绩为score find name 表示查找名字为name的学生的数学成绩 注意有些同学可能会
  • Rancher基础使用

    Rancher基础使用 安装 以下安装是在centos7 环境下 注意 生产环境建议在 Kubernetes 集群上安装 Rancher 因为在多节点集群中 Rancher Server 可以实现高可用 这种高可用配置可以提升访问下游集群的
  • 【流媒體】jrtplib—VS2010下RTP开源协议库JRTPLIB3.9.1编译

    流媒體 jrtplib VS2010下RTP开源协议库JRTPLIB3 9 1编译 SkySeraph Apr 7th 2012 Email skyseraph00 163 com 一 JRTPLIB简介 老外用C 编写的开源RTP协议库
  • matlab、C语言实现时域卷积运算

    背景 某次面试 岗位为音频算法 遇到了c语言实现卷积的编程题 当时不够精通c语言 写的程序比较垃圾 现在重新整理了一下 原理 卷积公式 matlab有自带的计算卷积的函数conv 根据公式 现编写实现卷积的函数并与自带函数做对比 关键点 假
  • 初步C++: g++: error: CreateProcess: No such file or directory

    问题 使用eclipse 环境 学习 c 出现如下错误 g error CreateProcess No such file or directory 经过百度查找 花了接近一天时间 始终找不到问题原因 今天下午出去上完 英语课回来的时候
  • 07-Java框架-SpringBoot整合MyBatis

    一 SpringBoot整合mybatis 1 1 添加依赖 创建springboot项目 添加依赖 编写启动类等 并在springboot依赖的基础上加入 mysql 和 springboot整合mybatis 的依赖 依赖对应关系参考官
  • Proxyee Down百度网盘高速下载器详细使用教程

    之前的Mac介绍毒了很多关于百度云提速的文章 但随着时间的推移 也都一一失效 今天再为大家带来一款百度云提速神器Proxyee Down 测试可以正常使用 速度也是非常的快 但不能保证所有资源下载正常 下面为大家整理详细的教程 希望大家可以
  • 更改jar包里的代码

    1 将class文件改成java文件 如果你的jar包中是包含源代码的 即包含java文件 请跳过此步 先将jar包通过winrar或者快压等解压缩软件将jar包解压缩 再通过一些专门的Java反编译工具将class文件转换为java文件
  • 如何将Android studio 的项目变成Lib工程,供项目使用

    最近公司项目比较松 在这里我优化项目时 突然想到就写一下关于项目怎么搞成lib包来给其他项目引用的过程 下面就是所有的步骤 说得很详细呢 1 先创建一个PersonLibDemo的一个Android项目 在这个项目创建一个类 方便测试在别
  • C#读写欧姆龙PLC数据omron 使用TCP/IP FINS协议

    很多自动化设备使用OMRON PLC来控制制造过程 如果有SCADA 数据系统需要获取PLC的数据 甚至控制制造过程的参数 如加热温度 切割长度等 这需要一个中间层来执行这个任务 这个类就是为这种需求而设计的 可以把它嵌入到你的应用中 让你
  • 计算机磁盘组织选项,电脑d盘怎么清理 选择常规选项然后点击磁盘清

    谈论到电脑 大家应该都了解 有人问电脑d盘如果满了怎么办 当然了 还有人想问电脑d盘满了 怎么清理 这到底怎么回事呢 事实上电脑里面的d盘怎么没有了呢 下面小编就会给大家带来电脑d盘怎么清理 下面就和大家分享一下吧 电脑d盘怎么清理 具体操
  • PageHelper.startPage的使用

    PageHelper startPage的使用 PageHelper是MyBatis的分页插件 它能够帮助我们快速且简洁的实现分页功能 传统的分页都需要我们程序员手动在sql语句里写LIMIT语句 而PageHelper这个插件能够帮助我们
  • 时序预测

    时序预测 MATLAB实现基于EMD LSTM时间序列预测 EMD分解结合LSTM长短期记忆神经网络 目录 时序预测 MATLAB实现基于EMD LSTM时间序列预测 EMD分解结合LSTM长短期记忆神经网络 效果一览 基本描述 模型描述
  • python 情感分析实例_基于Python的情感分析案例

    情感分析 又称为倾向性分析和意见挖掘 它是对带有情感色彩的主观性文本进行分析 处理 归纳和推理的过程 其中情感分析还可以细分为情感极性 倾向 分析 情感程度分析 主客观分析等 情感极性分析的目的是对文本进行褒义 贬义 中性的判 情感分析 又
  • 某互联网公司前端JS代码规范

    JavaScript编程规范 1 概述 目的 规范开发部员工在项目开发过程中的JavaScript编码 进而提高系统性能及代码的可读性 降低维护的难度 适用范围 使用JavaScript语言开发的所有人员 2 排版规范 1 程序块采用缩进风
  • linux pm2功能说明,PM2命令使用方法介绍

    PM2是具有内置负载平衡器的Node js应用程序的生产过程管理器 它使您可以永久保持应用程序的活动状态 无需停机即可重新加载应用程序 并且可以方便常见的系统管理任务 在生产模式下启动应用程序非常简单 pm2 start app js 官方
  • 动态规划法(JavaScript)

    目录 一 动态规划 二 性质 三 典型问题 四 求解的基本步骤 五 案例 1 爬梯子问题 2 最大和的连续子数组 一 动态规划 动态规划 简称DP 的思想是把一个大的问题进行拆分 细分成一个个小的子问题 且能够从这些小的子问题的解当中推导出