点集配对问题的状态转移方法

点集配对问题  空间里n个点,使它们配成n/2对点,使得每个点恰好在一个点对中。

要求所有点队中,两点距离之和尽量下  n <= 20


d(s) = min(d{S - {i} - {j}+ |Pi Pj|  | j属于S, j > i, i = min{S}}

这里解释一下min(S)的意思,其实倒不一定指的是距离原点最小。就算是按照输入的顺序也没关系。

假设原来有三对点:s={1,2,3,4,5,6}。

如果在第一个状态中我们认为1必须取,那么剩下的状态就会有{3,4,5,6},{2,4,5,6},{2,3,5,6},{2,3,4,6},{2,3,4,5}

五种情况,疑问是如果第一次取的是{2,3}怎么办,由上面的状态可以知道存在{2,3}的状态有{2,3,5,6},{2,3,4,6},{2,3,4,5}这三个集合,也就是说他们会需要对{2,3}做一次取舍决断,但是他们的上一个状态是取{1,x}的,也就是说,在上一次的抉择中,他们不是没有考虑到除了{1,x}的情况,只是推迟决定。这样做的目的是防止重复。例如{1,2,3,4,5,6}->{3,4,5,6}->{5,6}与{1,2,3,4,5,6}->{1,2,5,6}->{1,2}他们取舍的子集都是相同的。

由于改变的只是最优解路径上的顺序,因此并不会影响最优解的总和值【路径长度】,因此是完全可行的。

解题采用的是状压dp,主要是避免多维度大开销的问题。如果用一维表示一个点的取舍状态的话,那么6个点就需要6^6,20个点需要20^20。所以采用n位二进制,0代表舍,1代表取。


猜你喜欢

转载自blog.csdn.net/qq_39304630/article/details/79186195
今日推荐