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):随机森林算法详解及小白都能看懂的调参指南...

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

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…

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

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

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

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

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

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

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

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

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

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

Linux文件系统为,浅析Linux文件系统

原标题:浅析Linux文件系统一、文件系统层次分析由上而下主要分为用户层、VFS层、文件系统层、缓存层、块设备层、磁盘驱动层、磁盘物理层用户层最上面用户层就是我们日常使用的各种程序,需要的接口主要是文件的创建、删除、打开、关闭、写、读等。VFS层我…

求解出n以内所有能被5整除的正整数的乘积_所有最常见最经典的算法题都在这里了...

1、一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到…

linux lvm 系统快照,系统运维|在 LVM中 录制逻辑卷快照并恢复(第三部分)

LVM快照是以空间换时间时间的方式制作的lvm卷副本。它只在lvm中工作,并只在源逻辑卷发生改变时占用快照卷的空间。如果源卷的变化达到1GB这么大,快照卷同样也会产生这样大的改变。因而,对于空间有效利用的最佳途径,就是总是进行小…

python语言变量随时声明_2. Go语言五种变量创建的方法

对于只有 Python 语言经验的朋友,也许会不太理解声明这个词,在 Python 中直接拿来就用,也不用声明类型啥的。 Go 语言是静态类型语言,由于编译时,编译器会检查变量的类型,所以要求所有的变量都要有明确的类…

会java需要多久能学会python_java好学吗?零基础学java要多久?

java好学吗?零基础学java要多久? 时间:2019-05-21 来源:华清远见 2019年3月,tiOBE 公布了编程语言排行榜,正如官方所说,本月的排名几乎没有任何有趣的变化,排名前十的依然是&…

jboss架构_检查Red Hat JBoss BRMS部署架构的规则和事件(第二部分)

jboss架构(文章来宾与北美红帽公司高级中间件顾问约翰赫洛克 ( John Hurlocker)合着) 在这周的技巧中,我们将放慢速度,并仔细研究可能的Red Hat JBoss BRMS部署体系结构。 在谈论部署体系结构时&#xff…

TestNG中的参数化– DataProvider和TestNG XML(带有示例)

测试自动化,或所谓的自动化测试,并不像听起来那样容易。 必须考虑所有可能的用户交互的所有排列和组合,并且在此基础上,您将必须创建测试脚本以通过多种浏览器和OS组合来验证Web应用程序。 这就是参数化在Selenium自动化测试中起关…

zbrush 添加纹理贴图_想学习3D游戏模型,3Dmax、MAYA和ZBrush都需要掌握吗?

想从事游戏行业的建模的话,模型和贴图的知识都得学,MAYA和3DMAX只能说是基本要学的,Zbrush能够提升个人价值,之后能给你建好的模型做出好看的贴图,才能算是一个游戏建模方面能干活的合格从业人员。新手入门的话&#x…

file.getpath_Java中File的getPath(),getCanonicalPath()和getAbsolutePath()之间的区别...

file.getpathFile API在Java中非常重要,因为它使文件系统可以访问Java程序。 尽管Java的文件API丰富,但是使用它们时仍需要了解很多细节。 关于文件路径的常见查询程序员之一是getPath() , getCanonicalPath()和getAbsolutePath()方法之间的区…

linux 在线帮助,linux获取在线帮助

Linux系统的帮助文档非常丰富。帮助手册提供命令的使用说明。比如你若是想了解ls命令的用法,只需运行:$ man ls帮助手册旨在提供基础知识和参考信息,有时会有一些实例和交叉索引,但是基本没有那种教程式的文档。帮助手册会按系统排…

linux中samba详解,详解linux系列之samba的安装及配置

上篇博文中我介绍了FTP,今天我们来介绍一下samba实现文件共享。这个比FTP更好点,因为对用户的权限可以通过samba权限和系统权限交叉使用,取最严格的。可以让windows更容易的从linux系统上存取文件,还有samba也可以让linux上面的打…

使用Apache Kafka,Kubernetes和Envoy,Istio,Linkerd的服务网格和云原生微服务

微服务架构不是免费的午餐 ! 微服务需要解耦,灵活,操作透明,数据感知和弹性。 过去几年的大多数材料仅讨论具有紧密耦合且不可扩展的技术(如REST / HTTP)的点对点体系结构。 这篇博客文章介绍了Apache Kafk…