维特比算法主要用来解决篱笆网络,老实讲我第一次听到这个名字是发懵的,网络我是知道的,说白了就是图(迪杰特斯拉算法)
但是,篱笆网络是值下面这种一列一列的图,只会前面连接到后面,而且不会跳层连接,可以说是一种非常特殊且友好的图了(正常的图能逼死强迫症)
动态规划求最长路径
现在问题是要求出从A到E的最长路径。我们都知道dijkstra可以求最短路径,是否可以求最长路径呢?答案好像是不可以的(但是看了评论,有人说用一个最大值减去所有的路径
x
−
=
x
m
a
x
−
x
x^-=x_{max}-x
x−=xmax−x,这样原来大的值就变成现在小的值了,这时再用dijkstra求最短路径)。但是对我来讲,最直接的办法就是动态规划(无法理解dijkstra,怎么看都是动态规划)。
我们假设A到E点的最短路径为dis[A][E],到达E之前是先要经过D1,D2,D3,那么最短路径可以表示为
d
i
s
[
E
]
=
m
i
n
(
d
i
s
[
D
1
]
+
c
[
D
1
]
[
E
]
,
d
i
s
[
D
2
]
+
c
[
D
2
]
[
E
]
,
d
i
s
[
D
3
]
+
c
[
D
3
]
[
E
]
)
dis[E]=min(dis[D1]+c[D1][E],dis[D2]+c[D2][E],dis[D3]+c[D3][E])
dis[E]=min(dis[D1]+c[D1][E],dis[D2]+c[D2][E],dis[D3]+c[D3][E])可以看到,我们把求dis[E]的问题转化为求解子问题dis[D1]等等,写成递推式为
d
i
s
[
i
]
=
m
i
n
(
d
i
s
[
j
]
+
c
[
j
]
[
i
]
)
dis[i]=min(dis[j]+c[j][i])
dis[i]=min(dis[j]+c[j][i])其中
j
j
j表示与
i
i
i边有连接的节点。