其他分享
首页 > 其他分享> > Not TSP

Not TSP

作者:互联网

小 F 是贫困大学的毕业生,毕业以后找不到工作去酸了么公司送外卖。

他所在的城镇有 \(n\) 个地区,第 i 个地区和第 \(j\) 个地区之间的距离是 \(d(i,j)\) (即从 \(i\) 到 \(j\) 和从 \(j\)到 \(i\) 都需要 \(d(i,j)\) 的时间),他每天的工作是要把这些地区都访问一次且恰好一次(去了以后把外卖送了)。起点和终点是任意指定的。

在他短暂的大学生活里,他学到了一件事,那就是 TSP 问题是 NPC 的。

为了不让自己陷入选择困难综合症,他决定给这个问题加上限制。

当访问第 i 个地区的时候,要么 \(1\cdots i−1\) 这些地区都还没去过,要么这些地区都已经去过了。

求他把这些地区都访问一次且恰好一次所需的最少时间。

输入格式
第一行一个整数表示城市个数 \(n\) 。

接下来的 \(n\) 行,每行 \(n\) 个整数表示 \(d(i,j)\) 。

输出格式
一行一个整数表示答案。

样例
input

3
0 5 2
5 0 4
2 4 0

output

7

数据范围
时限1s 空间256M

对于 20% 的数据, \(n≤10\) 。

对于 40% 的数据,$ n≤20$ 。

对于 100% 的数据, \(n≤1500\) 。

思考在这个限制下的过程,首先选择一个点,然后一直把编号变小,直到变小到1时,再把剩下的编号全部遍历一遍。也就是说,一个点有两种选择,要不就是在变小的过程中被遍历,要不就是在变大的过程中被遍历。

考虑dp,我们dp时把一个点分成变小过程中的和变大过程中的,那么如果他是变小过程中的,就把他dp的值加上他和上一个变小过程中的人的距离,否则就加上他和下一个变大过程中的人的距离,然后取最小值。

注意一件事,定义\(dp_{i,j}\)为上一个变小过程中的是\(i\)变大过程中的是\(j\),那么我们可以知道现在遍历到\(max(i,j)\).所以我们不用再记录现在到了第几个数了。

标签:遍历,一个点,变小,地区,TSP,过程,dp
来源: https://www.cnblogs.com/mekoszc/p/16172033.html