我遇到了这个问题:
有两个人。有 n 个城市的有序序列,并且每对城市之间的距离是给定的。您必须将城市划分为两个子序列(不一定是连续的),使得人 A 访问第一个子序列中的所有城市(按顺序),人 B 访问第二个子序列中的所有城市(按顺序),并且使得A 和 B 行驶的总距离最小。假设A和B最初从各自子序列中的第一个城市开始。
我寻找它的答案,答案是:
设 c[i,j] 为第一个人停在城市 i、第二个人停在城市 j 时所行驶的最短距离。假设 i
c[0,j]= k 从 1 到 j-1 的 (d[k,k+1]) 之和
c[i,j] = min(c[k,j]+ d[k,i]) 如果 i!=0 其中 0
解决方法也可参见第10题here http://courses.csail.mit.edu/6.006/fall10/handouts/dpproblems-sol.pdf
现在,我的问题是:
1. 该解没有 i=1 的定义(因为此时 k 没有值)。
2. 现在,假设我们正在寻找 c[2,3]。它将是 c[1,3]+ d[1,2]。现在 c[1,3] 表示人
B 访问了 0、2 和 3,而 A 保留在 1 或 B 访问了 2、3 和 A
访问了 0 和 1。另外,c[2,3] 表示 A 只访问了 2/ 0,1,2 /0,2 /1,2。所以,
c[1,3] = min(d[0,1]+ d[2,3], d[0,2]+ d[2,3])
c[2,3] = min(d[0,1]+ d[1,2], d[0,2]+ d[1,3], d[1,2]+d[0,3], d[0,1]+d[1,3])
可以看出,解决方案并不重叠。
换句话说,2已经被c[1,3]中的B覆盖了。因此,如果我们将 c[1,3] 包含在 c[2,3] 中,则意味着 A 和 B 都访问了 2,这不是必需的,因为它只会增加成本。
如果我错了,请纠正我。