UVa-1347
Updated:
- 参考:《算法竞赛入门经典》(白书)
题目大意:
给n(n<=1000)个点的坐标(按x递增,且各个点的坐标不同,都为正整数),设计一条线路,从最左边的点出发,走到最右边的点然后返回,要求除了最左点和最右点之外每个点恰好经过一次,且路径总厂最短。两点的长度为他们的欧几里得距离。
思路:
- 定义d(i,j)表示1~max(i,j)全部走过,第一个人在i,第二个人在j,还需要走多长的距离。
- 然而这样似乎很难保证两个人不会走到相同的点,所以需要改下。因此,定义状态中i>j(这样不管哪个人,下一步只能到i+1,i+2,…这些点),且状态d(i,j)
只能转移到d(i+1,j)和d(i+1,i)
- 注意:d(i+1,j)代表第一个人走到i+1,第二个人走到j,就是说第一个人向前走了一步。而d(i+1,i)代表第一个人走到i,第二个人走到i+1,就是说第二个人向前走了一步。(d(i,j)其实就等于d(j,i),就是交换了下人而已,这里要把d(i,i+1)写成d(i+1,i)因为规定了状态是i>j的)。
边界是
d(n-1, j) = dist(n-1, n) + dist(j, n);
至此,不得不佩服刘老师的解法。
1 |
|