当前位置: 代码迷 >> 综合 >> POJ2677 Tour(DP:双调巡游)
  详细解决方案

POJ2677 Tour(DP:双调巡游)

热度:49   发布时间:2024-01-16 13:35:22.0

题意:

算法导论上的一道习题,给出一系列点的的坐标,现在从最左端出发,到达最右端的点,再返回原点,要求遍历所有点并且路程最短。

要点:

出发又返回可以看成两个人同时从左往右走,其中一个人走的快一个人走的慢。重点是因为一个点只能走一次,所以可以想出最优子结构,假设现在用dp[i][j]表示两个人分别走到点i和j的最短路径,下一步是走到i+1这个点,那么可能是位置为i的人走到,又或者是位置为j的人走到。可以写出状态转移方程:

dp[i + 1][i] = min(dp[i + 1][i], dp[i][j] + dis[i + 1][j]);i+1分配给位置为j的人

dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + dis[i][i + 1]);i+1分配给位置为i的人

我们最后要求的dp[n][n]一定是从dp[n][n-1]而来的,所以最后直接dp[n][n-1]+dis[n-1][n]就是答案。下面两个图可以方便理解。我写的时候用memset直接数组赋值,非常容易出错。



<