编程之美最短路径

Posted 程序员互动联盟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程之美最短路径相关的知识,希望对你有一定的参考价值。

最短路径

任意给定两个数字A和B,通过将A和6个数(7,-7,5,-5,12,-12)做加减运算,运算次数不限,每个数可以被使用多次,求从A到B最少要经过多少次运算?

比如:A=0, B=19,从A到B的一条路径为{0,7,19},经过2次运算得到。{0, 5, 12,19}也是符合要求的一条路径,但是需要经过3次运算才可以得到。所以最少要经过2次运算才可以实现从0到19.


01
class

解题思路:

方案一:DP从A到B,可以简化为从0到abs(A-B)

设S[i]为从0到i的最短路径

那么 S[i]=min(S[v]+S[i-v])

方案二:限制条件: det=12a+7b+5c

目标函数: S=|a|+|b|+|c|

a,b,c若有一个以上为0,则变成二元整数线性规划的问题,好像是经典问题,易解。

如果三者都不为零,则:

如果b,c同号,则一个(7+5)用一个12代替,可以得到更优解

如果b,c异号,则其中必有一个与a异号,(12-7)用5代替,或(12-5)用7代替,可以得到更优解

综上,最优解中,a,b,c肯定至少有一个为0

所以分别做3次二元线性规划,取最优的即可

方案三:题意中的12,-12完全没意义,因为可以用(7,5) (-7,-5)代替。

因此只需要考虑(7,-7,5,-5)。

A + (7x+5y) = B  -> 7x+5y=(B-A)

ax+by=d

然后扩展欧几里得算法。




code也是一种艺术,它能展现出自己的美。



以上是关于编程之美最短路径的主要内容,如果未能解决你的问题,请参考以下文章

数学之美:维特比和维特比算法

编程之美数组分割

宽度优先算法实践

八年级数学上册:轴对称之最短路径将军饮马问题举例

设计模式之美——看似面向对象,实则面向过程

编程之美 2.10寻找数组中的最大最小值