讨论动态规划的优点 - 相比于穷举法 - (以最短路径为例)

2024-02-25 00:18

本文主要是介绍讨论动态规划的优点 - 相比于穷举法 - (以最短路径为例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

讨论动态规划的优点 - 相比于穷举法 - (以最短路径为例)

一、熟知动态规划有以下的优点:

优点1.减少了计算量,随着段数的增加,计算量大大减少。

优点2.计算中得到了很多有用的中间过程,不仅得到了出发点到终点的最短路径,而且得到了中间各点到终点的最短路径。

二、回顾动态规划的基本思想:


三、通过以下例子,我们将清楚的看到动态规划的优点:(以最短路径为例)

1、段数较少

以下的图为例


说明动态规划的优点,这里我们以整个过程中做的加法次数为指标,次数越少,我们认为计算量越好,效率越高。

穷举法的加法次数:1*2*3*1 = 6

动态规划(逆向D->A):2*3+1*2 = 8

(说明:动态规划第一步从B->D,不从C->D,C->D不存在选择最短路)

这个似乎不能说明动态规划比穷举法的计算量小,其实是阶段数较少,当阶段数增加后,动态规划的优势明显体现。

2、段数较多


(假设每一层的某个状态都可以到达下一层的每个状态)

穷举法的加法次数:1*2*3*4*4*3*2*1 = 576

动态规划(逆向D->A):3*2+4*3+4*4+3*4+2*3+1*2 = 54

这下明显可以看出动态的优势,大大减少了计算量;至于说得到有用的中间量,这个不用多解释。

3、量化直接说明动态规划减少计算量的优势

以二中的特殊情况为例,两边对称,段数为偶数的情况,所以一共有2n个阶段(加上始末)。

穷举法的加法次数:(1*2*3*…*n)^2 = (1*2*3*…*n)*(1*2*3*…*n

动态规划的加法次数:(n*n+(n-1)n+(n-2)(n-1)+...+1*2)*2-1*2(n*n+(n-1)n+(n-2)(n-1)+...+1*2)*2 < (n*n+(n-1)n+(n-2)n+...+1*n)*2 = (n+(n-1)+(n-2)+...+1)*n*2

当n>3时,(1*2*3*…*n)> (n+(n-1)+(n-2)+...+1) 这个成立,随着n变大差距越越大,毕竟是相乘嘛!

(1*2*3*…*n)> n*2

所以很明显,当段数增加时,动态规划的计算量是成倍成倍的减少。

四、注意动态规划中的无后效性(马尔可夫性)

如果某阶段状态给定后,则在这个阶段以后过程的发展不受这个阶段以前各段状态的影响;
过程的过去历史只能通过当前的状态去影响它未来的发展;构造动态规划模型时,要充分注意是否满足无后效性的要求;

这篇关于讨论动态规划的优点 - 相比于穷举法 - (以最短路径为例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/743851

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR