Algorithm 有趣的最小价格问题

Algorithm 有趣的最小价格问题,algorithm,math,Algorithm,Math,共有n个公共汽车站,我们知道第i站和第j站之间的费用。 这是一条单行道。考虑到所有可能的连接,从第一站到第n站的路线的最低价格是多少?时间和内存消耗应该尽可能少 p、 举个例子,比如说,有4站。我们有这样一个价格表: . 3$ 5$ 7$ . . 1$ 3$ . . . 1$ . 3$ 5$ 7$ . . 1$ 3$ . . . 1$ 从1号到4号不停,我们付7美元。如果我们在第二站改变路线,我们需要支付3$+1$=4$才能开到第三站,但是如果我们开到终点站,我们需要多付2$,所以总

共有n个公共汽车站,我们知道第i站和第j站之间的费用。 这是一条单行道。考虑到所有可能的连接,从第一站到第n站的路线的最低价格是多少?时间和内存消耗应该尽可能少

p、 举个例子,比如说,有4站。我们有这样一个价格表:

. 3$ 5$ 7$ . . 1$ 3$ . . . 1$ . 3$ 5$ 7$ . . 1$ 3$ . . . 1$
从1号到4号不停,我们付7美元。如果我们在第二站改变路线,我们需要支付3$+1$=4$才能开到第三站,但是如果我们开到终点站,我们需要多付2$,所以总体上需要花费6$,但是如果我们在第三站改变路线,我们需要支付4+1=5$。

这是一个标准的加权有向图路径搜索。Dijkstra的算法可以找到从源节点到所有其他节点的最短路径,这是你能做的最好的方法。

d[i][j]
成为给定的价格,
l[k]
是从
k
n
的最小总成本。然后

l[n]=0

l[k]=min(d[k][i]+l[i],i=k+1..n)


运行时间为O(n^2)。(正如@Henrik所指出的,它是最优的。)

输入数据的大小是n^2级,所以我不认为有O(n)算法。@Henrik如果没有,那是很有可能的,问题是:什么是最优的解决方案?是否只有Ij?@adamax:是的,因为问题表明这是一条单行道。@adamax对,只有这样。正如我在示例表中给出的。点表示没有回程路线。如果您知道最低价格(例如1美元),您可以提前中止。我知道,问题中没有说明。作为事后的思考,我们通常谈论最坏的情况,因为最好的情况通常没有多大意义。Dijkstra是O(E+V log V)=O(n^2+n log n)=O(n^2)。渐近等价。我认为二进制堆的变体是一个优先级队列,即O(E log V)。但朴素的版本是O(V^2+E),在这里更好。O(E+V log V)需要Fibonaccy堆,AFAIK,这是一种过度的杀伤力。我知道。不过,它代表了给定问题的现实优化。