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

点集配对问题  空间里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代表取。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值