c++矩阵连乘的动态规划算法并输出_「Javascript算法设计」× 动态规划与回溯算法...

目录:

  • 分而治之算法
  • 动态规划
  • 回溯算法

分而治之算法

分而治之算法是算法设计的一种方式,它将一个问题分成多个和原问题相似的小问题,递归解决小问题,再将解决方式合并以解决原来的问题(例如快速排序,二分搜索等)

分而治之算法可以分成三个部分

  1. 分解原问题为多个子问题(原问题的多个小实例)
  2. 解决子问题,用返回解决子问题的方式的递归算法。递归算法的基本情形可以用来解决子问题
  3. 组合这些子问题的解决方式,得到原问题的解

我们利用二分搜索作为例子来看看什么是分而治之,利用分而治之的理念,实现二分搜索可以是以下逻辑:

  1. 分解:计算mid并搜索数组较小或较大的一半
  2. 解决:在较小或较大的一半中搜索值
  3. 合并:这步不需要,因为我们直接返回了索引值
function 

首先,找到找不到搜索值时的终止条件(行{1}),也就是当左右边界相触时,表示找不到该值,返回 -1。然后定义中间值mid(行{2}),判断中间值和搜索值的大小,若相等,直接返回中间值(行{3}),若中间值小于搜索值,这对左边子数组进行搜索,将右边边界缩小到当前中间值的前一位(行{5}),进行下一轮递归,若中间值大于搜索值,则对右边子数组进行搜索,将左边边界增加到当前中间值后一位(行{7}),进行下一轮遍历。

注意,第一次传入的函数的数组必须是经过排序的,并且low表示数组第一个下标,high表示数组最后一个下标

3fc91aa90dbbfa3cc50219bbc8c8d9af.png

动态规划

动态规划(dynamic programming,DP)是一种将复杂问题分解成更小的子问题来解决的优化技术

注意:动态规划和分而治之是不同的方法。分而治之方法是把问题分解成相互独立的子问题,然后组合它们的答案,而动态规划则是将问题分解成相互依赖的子问题。

用动态规划解决问题时,要遵循三个重要步骤:

  1. 定义子问题
  2. 实现要反复执行来解决子问题的部分
  3. 识别并求解出基线条件

下面我们通过两个例子来看动态规划的实战操作(背包问题,最长公共子序列)

· 背包问题

背包问题是一个组合优化问题,它可以描述如下:

给定一个固定大小,能够携重量W的背包,以及以组有价值和重要的物品,找出一个最佳解决方案,使得装入背包的物品总重量不超过W,且总价值最大

例子:

7b3b304ce31d0ec1ad65b969e31b84a6.png

考虑背包能够携带的重要只有5,我们规定只能往背包里装完整的物品(0-1背包)。对于这个例子,我们可以说最佳解决方案是往背包里装入物品1和物品2,这样总重要5,总价值为7

我们来实现这个背包算法:

function 

我们来分析上面这段代码是如何工作的

搜先,初始化将用于寻找解决方案的矩阵(行{1})。矩阵为 kS[n+1][capacity + 1]。然后,忽略矩阵的第一列和第一行,只处理索引不为0的列和行(行{2})并且要迭代数组中每个可用的项。物品i的重要必须小于约束capacity(行{3})才有可能成为解决方案的一部分;否则,总重要就会超出背包能够携带的重要,这是不可能发生的。发生这种情况时,只要忽略它,用之前的值就可以了(行{5})。当找到可以构成解决方案的物品时,选择价值最大的那个(行{4})。然后,问题的解决方案就在这个二维表格右下角的最后一个格子里(行{7})

我们做一个测试用例

const values = [3,4,5]
weights = [2,3,4]
capacity = 5
n = values.length

下图说明例子中kS矩阵的构造

213b5a577c4599456544e0ab26b91295.png

请注意,这个算法只输出背包携带物品价值的最大值,而不列出实际的物品。我们可以增加下面的附加函数找出构成解决方案的物品(行{6})

function 

· 最长公共子序列

另一个经常被当作编程挑战问题的动态规划问题是最长公共子序列(LCS):找出两个字符串序列的最长子序列的长度。最长子序列是指,在两个字符串序列中以相同顺序出现,但不要求连续(非字符串子串)的字符串序列

考虑如下的例子。

aa98e28d2d2c880ba2f3a3a33ad172e6.png

再看看具体的算法

function 

与背包问题比较,我们会发现两者非常相似,这项从顶部开始构建解决方案的技术被称为记忆化,而解决方案就在表格或矩阵的右下角

我们用图来展示:

6f8dfa67a9f8aec93b236da1175b3c46.png

回溯算法

回溯是一种渐进式寻找并构建问题解决方式的策略。我们从一个可能的动作开始并试着用这个动作解决问题。如果不能解决,就回溯并选择另一个动作直到将问题解决。根据这种行为,回溯算法会尝试所有可能的动作(如果更快找到了解决方法就尝试较少的次数)来解决问题

我们以迷宫老鼠问题来看回溯算法

假设我们有一个大小为N x N的矩阵,矩阵的每个位置是一个方块。每个位置(或块)可以是空闲的(值为1)或是被阻挡的(值为0),如下图所示,其中S是起点,D是终点

04bbb889e06ef7393ff6e45b61884d75.png

矩阵就是迷宫,‘老鼠’的目标是从位置[0][0]开始并移动到[n-1][n-1](终点)。老鼠可以在垂直或水平方向上任何未被阻挡的位置间移动

我们先声明下算法的基本结构

function 

首先创建一个包含解的矩阵。将每个位置初始化为零(行{1})。对于老鼠采取的每步行为,我们将路径标记为1。如果算法能够找到一个解(行{2}),就返回解决矩阵,否则返回一条错误信息(行{3})

然后我们开始构思findPath函数,它会试着从位置x和y开始在给定的maze矩阵中找到一个解。回溯技巧也使用递归,这也是这个算法有回溯能力的原因

function 

算法的第一步是验证老鼠是否到达了终点(行{4}),如果到了,就将最后一个位置标记为路径的一部分并且返回true,表示移动成功结束。如果不是最后一步,要验证老鼠能否安全移动至该位置(行{5} 表示根据下面声明的isSafe方法判断出该位置空闲)。如果是安全的,我们将这步加入路径(行{6})并试着在maze矩阵中水平移动(向右)到下一个位置(行{7})。如果水平移动不可行,我们就试着垂直向下移动到下一个位置(行{8})。如果水平和垂直都不能移动,那么将这步从路径中移除并回溯(行{9}),表示算法会尝试另一个可能的解。在算法尝试了所有可能的动作之后还是找不到解时,就返回false(行{10}),表示这个问题无解

实现isSafe函数

function 

下面进行测试

const maze = [[1,0,0,0],[1,1,1,1],[0,0,1,0],[0,1,1,1]
]
console.log(ratInAMaze(maze))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

背包问题九讲_背包问题

背包问题九讲我发现背包问题既棘手又有趣。 我敢肯定,如果您正在访问此页面,您已经知道了问题说明,但是只是为了完成本章: 问题: 给定一个最大容量为W和N的背包,每个背包都有自己的值和重量,将…

随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...

一、什么是随机森林前面我们已经介绍了决策树的基本原理和使用。但是决策树有一个很大的缺陷:因为决策树会非常细致地划分样本,如果决策树分得太多细致,会导致其在训练集上出现过拟合,而如果决策树粗略地划分样本,又不…

Java Code Geeks通过Twitter赠送了免费的Sublime Text Editor许可

正在与您的重量级编辑斗争? 然后,我们特别为您准备了一些东西! 我们正在举办比赛,免费赠送 kick-ass Sublime Text Editor 许可证 。 Sublime Text是用于代码,标记和散文的高级文本编辑器。 您会喜欢光滑的用户界面…

http端口_PhpStorm 修改默认端口号63342

PhpStorm 修改默认端口号63342​blog.csdn.net关键词PhpStorm phpStorm phpstorm 修改默认端口号63342 8080 80步骤1.打开Settings2. Build, Execution, Deployment→Deployment3.点击添加,选择In place起一个名字(可以随便起)在Web server U…

php根本自学不了,PHP开发自学还是培训?

员有两种,一种是会php的,一种是不会php的,今天我们不去说哪种开发语言好,哪种又不好,因为语言只是一种工具而已不管你是从IOS、.NET或其它语言进入这个行业,只要你在这个行业坚持多年,与php的感…

rds mysql 磁盘空间,RDS MySQL 空间问题的原因和解决

other_size- 系统文件和临时文件使用空间data_size- 数据文件使用空间binlog_size- Binlog 文件占用空间注:获取实例诊断报告的步骤请参考如何访问RDS 实例诊断报告。2. 解决RDS 实例支持单独升级磁盘空间,升级磁盘空间是解决空间问题的有效方式之一。下…

微信小程序 全局变量异步函数_微信小程序【生命周期】

小程序分为应用、页面和组件三个部分,所以小程序的生命周期涉及以下应用的生命周期页面的生命周期组件的声明周期应用的生命周期对页面生命周期的影响应用的生命周期App() 函数用来注册一个小程序。接受一个 Object 参数,其指定小程序的生命周期回调等。…

oracle agile 性能,Oracle Agile PLM安全漏洞(CVE-2016-3554)

Oracle Agile PLM安全漏洞(CVE-2016-3554)发布日期:2016-07-21更新日期:2016-07-25受影响系统:Oracle Supply Chain Products Suite 9.3.5Oracle Supply Chain Products Suite 9.3.4描述:CVE(CAN) ID: CVE-2016-3554Oracle Agile产…

java 挥发注解_Java的挥发性修饰符

java 挥发注解不久前,我写了一个Java servlet过滤器,该过滤器在其init函数中加载配置(基于web.xml的参数)。 筛选器的配置缓存在私有字段中。 我在字段上设置了volatile修饰符。 后来,当我检查Sonar公司以查看是否在代…

python 线程锁_python多线程编程(3): 使用互斥锁同步线程

问题的提出 上一节的例子中,每个线程互相独立,相互之间没有任何关系。现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1。很容易写出这样的代码&am…

Comnnect oracle,RAC监听日志与CRS日志

RAC监听日志:tnsname.oraCRS日志:位置:Oracle集群涉及的日志主要位于“$ORA_CRS_HOME/log”和“$ORACLE_HOME/log”目录中目录结构:tree -d $ORA_CRS_HOME/logtree -d $ORACLE_HOME/log禁止Clusterware在系统重启后自动启动&#…

python全栈开发百度云_价值2400 2016年11月全栈开发Flask Python Web 网站编程

01-计算机基础常识.mp4 02-Python语言概览、安装与运行.mp4 03-Python 变量、数据类型及存储.mp4 04-Python 常用数据类型概览.mp4 05-数值与字符串.mp4 06-列表list.mp4 07-字典表dict 与元组 tuple.mp4 08-文件与类型汇总.mp4 09-语句、表达式与if分支.mp4 10-循环语句.mp4 1…

Java / Spring:如何快速生成整个数据库CRUD REST API

随着时间的流逝,Spring框架已成为Java中使用最广泛的Web开发框架之一,这一点已变得显而易见。 在接下来的十年之际,Spring最受欢迎的模块Spring Boot刚刚进行了重大更新。 新的Spring Boot版本“ 2.2.0”和年份“ 2020”几乎完美匹配。 因此…

如何在虚拟linux环境运行python_Conda(Python)虚拟环境不能从Windows移植到Linux

在我的Windows 10计算机上,我使用以下命令创建了一个虚拟环境:>conda env export > environment.yml 我尝试在Windows系统上使用yml文件重新创建虚拟环境,效果很好。然后我转学了环境.yml在我的Linux机器(Ubuntu16.04.1&…

oracle两个表合并 sql,如何创建从两个表(Oracle DBMS)生成“合并”数据集的Select SQL语句?...

我最后做了两个步骤:第一步填充事件表1中的数据,第二步合并目标(第一步中的数据集)和另一个源之间的数据。请原谅我,因为法律原因,我不得不混淆表名并省略下面代码中的一些列。下面是SQL:INSERT INTO EVENTS_TARGET (VEHICLE_ID,EVENT_TYPE_ID,CLIENT_ID,EVENT_DATE,CREATED_DA…

php毕业设计遇到的问题,常见问题_php毕业设计_php课程设计_php大作业_原创作品下载网...

一、我们怎么交易?答:本站采用在线支付的方式,每个产品页面都有一个付款按钮,亲在线付款后页面会显示一个“订单号”,根据这个订单号在本站的下载页面(见顶部菜单)下载相应程序,注意,亲要在30分…

git maven 发布_Maven Git发布

git maven 发布在开始这篇文章之前,我需要指出我在去年才开始认真地与Git合作 。 不幸的是,我从事的许多项目仍在使用SVN或CVS,但现在我终于开始使用Git了 。 在过去的几年中,我使用Maven Release Plugin完成了许多软件发行。 我…

python界面长什么样图片_python界面是什么样的

安装完Python,在命令行输入“python”之后,如果成功,会得到类似于下面的窗口:可以看到,结尾有3个>符号(>>>)。>>>被叫做Python命令提示符(prompt)&…

php static 访问,使用PHP访问Static方法的最佳方法

这是我的课堂财产private $my_paths array(imagemagick > E:\Server\_ImageOptimize\ImageMagick,pngcrush > E:\Server\_ImageOptimize\pngCrush\pngcrush.exe,jpegtran > E:\Server\_ImageOptimize\jpegtran\jpegtran.exe,gifsicle > E:\Server\_ImageOptimize\…

python表格控件_python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例...

PyQt5表格控件QTableView简介 在通常情况下,一个应用需要和一批数据进行交互,然后以表格的形式输出这些信息,这时就需要用到QTableView类了,在QTableView中可以使用自定义的数据模型来显示内容,通过setModel来绑定数据…