【发布时间】:2012-11-17 21:38:53
【问题描述】:
我遇到了这个问题:
有两个人。有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
解决方法也可以看问题10here
现在,我的问题是:
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[2,3] 中包含 c[1,3],则意味着 A 和 B 都访问了 2,这不是必需的,因为它只会增加成本。
如果我错了,请纠正我。
【问题讨论】:
-
这不等于一个旅行者从旅行者B的终点开始,通过“第一个”到达A终点的所有城市吗?
-
@jdv-JandeVaan 你可能会这样看,如果你认为路径在那个“via”边缘被分割,这意味着那个边缘被移除了
-
另一种观点:让“状态”是哪个人在哪个城市,给你一个二次节点数。您可以通过让 A 或 B 移动到下一个未访问的城市来从一个节点移动到下一个节点,即每个节点最多有两条边,所以边的二次数。最短路径(由 DP 计算,即 DAG-Shortest-Path)以二次(而非三次)时间给出解。
标签: algorithm dynamic-programming