对于这个解法,网上题解一大堆。不过觉得还是算导官方给的解答好些,简洁又清楚。。。
大概总结一下(不是翻译)=.=
首先是排序。
然后确定状态 f[i][j] (i >= j, i == j表示的只有n这个点) 表示 从i到1严格从右往左走然后再从1严格从左往右走到j 这样两条路径的最小值,当然[1, max(i, j)]区间上所有的点都是被访问过得。
存在两种状态 :
1: j < i - 1;
dp[i][j] = dp[i-1][j] + Dis(i, i - 1);
2: j == i - 1;
dp[i][j] = min{dp[i][j], dp[j][k] + Dis(k, i)} //这个dp[j][k]本来应该是dp[k][j]的,但是由于dp[x][y] = dp[y][x]所以用dp[j][k]表示更方便,因为dp[i][j]满足i > j, dp[j][k]也满足j > k。
POJ 2677&&HDU 2224代码:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include