动态规划-最短路径个数问题
来源:互联网 发布:四海认证淘宝渔具钓竿 编辑:程序博客网 时间:2024/05/17 02:25
这里需要图,队列等相关知识,请参阅我之前的博客,都有详细说明。
问题:个点之间的线路如图所示,点与点之间的距离都是“1”,算A到T的最短路径,以及共有多少种这样的路径。
显然用图的广度搜索结合动态规划来解决这个问题是比较容易的。
数据结构:
setp(i):表示i对用的点到A点的最小路径步数。
path_num(i):表示i对应的点到A点最小路径的个数
状态转移方程:
if(step(j)==0)
step(j)=step(i)+1
path_num(j) = path_num(i)
if(step(j) = step(i)+ 1)
path_num(j)= path_num(i)+ path_num(j)
why:
第一种情况:
j是对i通过广度搜索找出的。如上图到G点路径只能是:F—>G,I—>G
当第一次到达G,也就是F—>G,此时step(G)==0,那么就是说G点是第一次触达,根据已知的信息,先记录着:
step(G)=step(F)+1 = 2 + 1 = 3
path_num(G) = path_num(F) = 2
这里有人可能说step(F),path_num(F)怎么算出来的,F是从B,E那算出来的,我们就是用前面的值去算后面的值,这就是之前说的动态规划,那么起点呢,我们规定step(A)= 0,path_num(A)= 1 ;即A到A的最短路径是0,A到A共有1种这样的最短路径。
step(G)=step(F)+1:(A到G的步数)=(A到F的步数)+1
path_num(G) = path_num(F):(A到G的路径个数)=(A到F的路径个数)X(F到G的路径个数)。乘法原理….,而F到G的路径个数为总是1。好像是废话…
第二种情况:
当F—>G之后,又会出现I—>G了,此时根据F—>G算出的step(G)= 3,path_num(G)= 2,以及step(I)= 2,path_num(I)= 1,这些值都是能根据之前已知值迭代出来的。
当出现I—>G时,此时的step(G)是有值的,这个值是F当初触达算出的,现在I触达了,这时就考虑怎么去更换。
如果step(I)+1 > step(G),I到G的步数比原来的还大,显然不用考虑更换了,但是这里因为用了广度搜索以及每次都是取最小值,step(I)+1 >step(G)是永远不会出现的,你在程序里写不写这段代码都可以,写上了可能更方便逻辑的理解。
同理step(I)+1 < step(G)也是不会出现的,你想想I到G都是用广度搜索算出来的,也就是说I到G的距离永远是1。所以只能出现2种情况要么step(G)==0要么step(I)+1 = step(G),step(G)==0已经讨论过了。
此时step(I)+1 = 2+1 = step(G)=3
也就是说I到G共有path_num(I)= 1种方法,F到G共有path_num(G) = path_num(F) = 2种方法,一共1+2=3中方法。
最终算出step(G),path_num(G)
不停的迭代下去直至到达T。
核心代码:
- 动态规划-最短路径个数问题
- 最短路径问题 动态规划
- 动态规划最短路径问题
- 动态规划算法--最短路径问题
- 动态规划 最短路径
- 动态规划 最短路径
- 最短路径 动态规划
- 最短路径(动态规划)
- 动态规划 0/1 背包问题, 最短路径问题
- 多段图的最短路径问题-----动态规划法
- 最短路径和最少花费问题--动态规划
- 动态规划题——最短路径问题
- 动态规划法求多段图的最短路径
- 动态规划 显示最短路径
- 动态规划、最短路径、Floyd算法
- 动态规划之最短路径
- 最短路径-动态规划-无
- 最短路径(动态规划dp)
- Nginx负载均衡
- android studio signatures are inconsistent
- javaseDay_11
- django 1.11 设置点击浏览器后退按钮时自动刷新
- Django 创建/删除用户
- 动态规划-最短路径个数问题
- 企业开发中选择logback而不是log4j的理由
- BZOJ
- tomcat常见错误跳转到指定页面
- Unity3d客户端与PhotonServer通信
- C/C++学习之C提高-----结构体定义、初始化、引用、结构体做函数参数、结构体数组、结构体中套一级/二级指针、结构体深copy和浅copy
- 自定义键盘
- Linux共享内存(顺便求解惑)
- html中meta标签详解