首页 > 编程语言 >算法笔记一之多段图问题(动态规划)【应试版】

算法笔记一之多段图问题(动态规划)【应试版】

时间:2024-11-18 15:49:13浏览次数:3  
标签:一之多段 10 12 min 应试 算法 cost 编号 11

提示:本文章不含代码,纯应试解题~(中国地质大学(武汉)研究生算法考试题目)

文章目录


前言

动态规划(Dynamic Programming,简称DP)是一种算法策略,用于解决具有重叠子问题和最优子结构特性的问题。多段图问题是一种特殊的动态规划问题,通常涉及到将一个整体问题分解成多个子问题,这些子问题可以看作是图中的多个段落或部分,然后通过解决这些子问题来解决整个问题。

说人话就是——想象一下,你正在规划一次旅行,你的目标是从一个城市(起点)出发,经过几个不同的城市(中间点),最终到达另一个城市(终点)。每个城市之间都有道路连接,每条道路都有其长度(费用)。你的目标是找到一条最短的路线,让你能够从起点城市到达终点城市,

一、问题描述

1.题目

如下图所示,多段图G是一个带权的有向图:
多段图问题
可以看到总共有5个阶段(在图中以 V 1 V_1 V1​~ V 5 V_5 V5​表示),起点的标号为1,终点的标号为12。

注意:多段图问题有且只有一个起点和终点。

2.符号描述

c o s t ( i , j ) cost(i,j) cost(i,j)代表第 i i i阶段的第 j j j状态距离起点的最短路径。举个栗子—— c o s t ( 2 , 2 ) cost(2,2) cost(2,2)表示的就是第2阶段(也就是图中所表示的 V 2 V_2 V2​段)里编号为2的点到起点1最短的距离,很容易知道起点1到编号为2的点的距离是9,所以 c o s t ( 2 , 2 ) = 9 cost(2,2)=9 cost(2,2)=9

3.公式介绍

c o s t ( i , j ) = m i n { c o s t ( i − 1 , l ) + c ( l , j ) } cost(i,j)=min\{cost(i-1,l)+c(l,j)\} cost(i,j)=min{cost(i−1,l)+c(l,j)}

c o s t ( i , j ) cost(i,j) cost(i,j)是一个动态规划的状态,表示到达第i个阶段,第j个编号的最短路径

c o s t ( i − 1 , j ) cost(i-1,j) cost(i−1,j)是第i-1个阶段,编号为l的成本,这里的l是一个中间变量

c ( l , j ) c(l,j) c(l,j)是编号为l的点到编号为j的距离,这个距离是固定的,在图中以边上权重表示,例如 c ( 1 , 2 ) = 9 c(1,2)=9 c(1,2)=9

温馨提示:一定要区分 c o s t cost cost和 c c c所表示的是不一样的哦~如果对公式不太清楚可以看看后面的解题步骤,就会很容易懂啦!(公式只是形式化表达,主要是看图)

二、解题步骤

1. s t e p 1 step \quad 1 step1

c o s t ( 1 , 1 ) = 0 cost(1,1)=0 cost(1,1)=0
这里表示的第一阶段的点到编号为1的点的距离,当然就是0啦,一般第一步就是算起点到起点之间的距离

2. s t e p 2 step \quad 2 step2

首先,我们要对第二个阶段每一个点进行计算,这里阶段2有编号为2,3,4,5的点,即要计算 c o s t ( 2 , 2 ) cost(2,2) cost(2,2)、 c o s t ( 2 , 3 ) cost(2,3) cost(2,3)、 c o s t ( 2 , 4 ) cost(2,4) cost(2,4)、 c o s t ( 2 , 5 ) cost(2,5) cost(2,5)

温馨提示:这里 c o s cos cos里的前面那个数表示的是阶段数哦~

c o s t ( 2 , 2 ) = m i n { c o s t ( 1 , 1 ) + c ( 1 , 2 ) } = 9 cost(2,2)=min\{cost(1,1)+c(1,2)\}=9 cost(2,2)=min{cost(1,1)+c(1,2)}=9

c o s t ( 2 , 2 ) cost(2,2) cost(2,2)表示第2个阶段编号为2的点距离起点1得最短距离,后面就不进行解释啦~

c o s t ( 2 , 3 ) = 7 cost(2,3)=7 cost(2,3)=7

c o s t ( 2 , 4 ) = 3 cost(2,4)=3 cost(2,4)=3

c o s t ( 2 , 5 ) = 2 cost(2,5)=2 cost(2,5)=2

3. s t e p 3 step \quad 3 step3

接下来就是对第3个阶段的每一个编号的点进行求解啦,即要计算 c o s t ( 3 , 6 ) cost(3,6) cost(3,6)、 c o s t ( 3 , 7 ) cost(3,7) cost(3,7)、 c o s t ( 3 , 8 ) cost(3,8) cost(3,8)。

这里与 s t e p 2 step2 step2有一点不同的是,要体现 m i n min min的作用了,因为这里这一个阶段的每一个编号的点可能有多个箭头指向它,而 s t e p 2 step2 step2中每一个编号的点只有起点1指它。

c o s t ( 3 , 6 ) = m i n { c o s t ( 2 , 2 ) + c ( 2 , 6 ) c o s t ( 2 , 3 ) + c ( 3 , 6 ) } = 9 cost(3,6)=min\left\{ \begin{aligned} cost(2,2)+c(2,6) \\ cost(2,3)+c(3,6) \\ \end{aligned} \right \}=9 cost(3,6)=min{cost(2,2)+c(2,6)cost(2,3)+c(3,6)​}=9

温馨提示:个人觉得可以不用套那个公式,直接看图就行啦。你看阶段3的编号为6的点,是不是只有阶段2中编号为2和3的点指向它,所以只要比较两个就行了。而在 s t e p 2 step2 step2中我们已经计算出了 c o s t ( 2 , 2 ) cost(2,2) cost(2,2)、 c o s t ( 2 , 3 ) cost(2,3) cost(2,3)了,然后在分别加上编号为2到编号为6的距离 c ( 2 , 6 ) = 4 c(2,6)=4 c(2,6)=4,以及编号为3到编号为6的距离 c ( 3 , 6 ) = 2 c(3,6)=2 c(3,6)=2就行啦~后面就不对此进行解释啦!

c o s t ( 3 , 7 ) = m i n { c o s t ( 2 , 2 ) + c ( 2 , 7 ) c o s t ( 2 , 3 ) + c ( 3 , 7 ) c o s t ( 2 , 5 ) + c ( 5 , 7 ) } = 11 cost(3,7)=min\left\{ \begin{aligned} cost(2,2)+c(2,7) \\ cost(2,3)+c(3,7) \\ cost(2,5)+c(5,7) \end{aligned} \right \}=11 cost(3,7)=min⎩ ⎧​cost(2,2)+c(2,7)cost(2,3)+c(3,7)cost(2,5)+c(5,7)​⎭ ⎫​=11

c o s t ( 3 , 8 ) = m i n { c o s t ( 2 , 2 ) + c ( 2 , 8 ) c o s t ( 2 , 4 ) + c ( 4 , 8 ) c o s t ( 2 , 5 ) + c ( 5 , 8 ) } = 10 cost(3,8)=min\left\{ \begin{aligned} cost(2,2)+c(2,8) \\ cost(2,4)+c(4,8) \\ cost(2,5)+c(5,8) \end{aligned} \right \}=10 cost(3,8)=min⎩ ⎧​cost(2,2)+c(2,8)cost(2,4)+c(4,8)cost(2,5)+c(5,8)​⎭ ⎫​=10

太好了,阶段三结束啦(小声哔哔:数学公式好难敲)

4. s t e p 4 step \quad 4 step4

然后,就是对第4个阶段的每一个编号的点进行求解啦,即要计算 c o s t ( 4 , 9 ) cost(4,9) cost(4,9)、 c o s t ( 4 , 10 ) cost(4,10) cost(4,10)、 c o s t ( 4 , 11 ) cost(4,11) cost(4,11)。

c o s t ( 4 , 9 ) = m i n { c o s t ( 3 , 6 ) + c ( 6 , 9 ) c o s t ( 3 , 7 ) + c ( 7 , 9 ) } = 15 cost(4,9)=min\left\{ \begin{aligned} cost(3,6)+c(6,9) \\ cost(3,7)+c(7,9) \\ \end{aligned} \right \}=15 cost(4,9)=min{cost(3,6)+c(6,9)cost(3,7)+c(7,9)​}=15

c o s t ( 4 , 10 ) = m i n { c o s t ( 3 , 6 ) + c ( 6 , 10 ) c o s t ( 3 , 7 ) + c ( 7 , 10 ) c o s t ( 3 , 8 ) + c ( 8 , 10 ) } = 14 cost(4,10)=min\left\{ \begin{aligned} cost(3,6)+c(6,10) \\ cost(3,7)+c(7,10) \\ cost(3,8)+c(8,10) \end{aligned} \right \}=14 cost(4,10)=min⎩ ⎧​cost(3,6)+c(6,10)cost(3,7)+c(7,10)cost(3,8)+c(8,10)​⎭ ⎫​=14

c o s t ( 4 , 11 ) = m i n { c o s t ( 3 , 8 ) + c ( 8 , 11 ) } = 16 cost(4,11)=min\left\{ \begin{aligned} cost(3,8)+c(8,11) \\ \end{aligned} \right \}=16 cost(4,11)=min{cost(3,8)+c(8,11)​}=16

温馨提示:由于编号11只有一个点指向它,所以也可以不用写 m i n min min也行哈~

5. s t e p 5 step \quad 5 step5

Oh~yeah,终于到最后一个阶段啦!这个阶段就是对终点12进行求解啦即要计算 c o s t ( 5 , 12 ) cost(5,12) cost(5,12)。

c o s t ( 5 , 12 ) = m i n { c o s t ( 4 , 9 ) + c ( 9 , 12 ) c o s t ( 4 , 10 ) + c ( 10 , 12 ) c o s t ( 4 , 11 ) + c ( 11 , 12 ) } = 16 cost(5,12)=min\left\{ \begin{aligned} cost(4,9)+c(9,12) \\ cost(4,10)+c(10,12) \\ cost(4,11)+c(11,12) \\ \end{aligned} \right \}=16 cost(5,12)=min⎩ ⎧​cost(4,9)+c(9,12)cost(4,10)+c(10,12)cost(4,11)+c(11,12)​⎭ ⎫​=16

完结啦, c o s t ( 5 , 12 ) = 16 cost(5,12)=16 cost(5,12)=16。这个结果就是我们要求的。它表示的就是第5个阶段编号为12的点(即终点)距离起点1得最短距离。


总结

个人觉得,动态规划问题的每一个阶段的结果都需要通过上一个阶段的结果得出,一层包裹着一层的感觉呀~
本人能力有限,如果有错误,请批评指正,本人感激不尽!

标签:一之多段,10,12,min,应试,算法,cost,编号,11
From: https://blog.csdn.net/qq_55170097/article/details/143780998

相关文章

  • 代码随想录算法训练营第六天|哈希表|LC242. 有效的字母异位词|LC349. 两个数组的交集|
    哈希表    哈希表:用来快速判断一个元素是否出现在集合里;O(1);    哈希碰撞:比如小王和小李都映射到索引下表1的位置,有2中解决办法(拉链法和线性探测法);    拉链发:通过索引找到,其实拉链发就是要选择适当的哈希表的大小,这样既不会因为数组空值而浪费大量内......
  • 代码随想录算法训练营第四天|LC24.两两交换链表中的节点|LC19. 删除链表的倒数第 N 个
    24.两两交换链表中的节点-力扣(LeetCode)    1、需要一个虚拟节点进行帮助;    2、注意虚拟节点的连接以及变化(尝试有点困惑它的变化,后面有点理解);    3、注意后续第二组的交换时如何与第一组交换进行连接;fromtypingimportOptionalclassLis......
  • 代码随想录算法训练营第三十二天| 509. 斐波那契数 、70. 爬楼梯、746. 使用最小花费
    理论基础总结一下就是:动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。动态规划五部曲确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组509.斐波那契数1.......
  • 代码随想录算法训练营第三十三天| 62.不同路径 、63. 不同路径 II、343. 整数拆分 。c
    62.不同路径思路:按照dp五步法分析,成功AC。代码随想录classSolution{publicintuniquePaths(intm,intn){int[][]dp=newint[m+1][n+1];dp[0][1]=1;for(inti=1;i<=m;i++){for(intj=1;j<=n;j++){......
  • AI智能分析视频分析网关周界入侵识别AI算法检测方案
    在当今这个信息化、智能化快速发展的时代,视频监控和人工智能技术的结合正在重塑我们对安全管理的认知。特别是在周界入侵检测等关键领域,AI视频智能分析技术的应用正带来一场效率和准确性的革命。在视频监控及AI视频智能分析领域,我们积累了丰富的技术经验和实践案例。周界入侵视频......
  • 摄像机实时接入分析平台视频分析网关烟火检测算法在街道安防场景中的应用
    传统的火灾防控方式,如安装烟雾报警器和消防器材,虽然在一定程度上能够减少火灾的发生和损失,但仍然存在诸多不足。相比之下,视频监控与智能分析技术的应用,为商铺火灾等安全管理带来了革命性的变革。通过摄像机实时接入分析平台视频分析网关的视频智能分析技术,可以对监控视频进行智能......
  • 某app最新版 vmp算法分析二
    第一篇文章看这里,某app最新版vmp算法分析一,这是第二篇关于赫利俄斯(H)的,拉顿(L)和H是同一个算法,所以L马上要下线了,而且最近看到了r0ysue代发了该公司的该算法的升级迭代招聘要求,80~130W,北深杭,寻思着已经防护的那么好了,还高薪招人,真是不给我们逆向留条活路啊.不过这......
  • 关于Java中算法的基础运用与讲解
    1.冒泡排序(BubbleSort)基本思路通过重复遍历要排序的列表,一次比较两个元素,如果它们的顺序错误就交换它们。这个过程会重复进行直到没有更多的交换需要做,这意味着列表已经排序完成。详细步骤外层循环:遍历数组的每个位置i,表示已经进行了多少轮比较。内层循环:从位置0......
  • ybtoj:二分算法
    A:数列分段点击查看代码#include<bits/stdc++.h>usingnamespacestd;intm,n;inta[100002];intl,r;boolcheck(intlimit){ intcnt=1,sum=0; for(inti=1;i<=n;i++) { if(sum+a[i]>limit){ cnt++; sum=a[i]; } else{ sum+=a[i]; } }......
  • 实验二:逻辑回归算法实现与测试
    一、实验目的深入理解对数几率回归(即逻辑回归的)的算法原理,能够使用Python语言实现对数几率回归的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的样本作为测试集(注意同分布取样);(2)使用训练......