【集合DP】复杂状态的动态规划

本文探讨了经典的最优配对问题,通过动态规划的方法解决该问题。利用二进制表示点集状态,并给出状态转移方程,实现对点集最优配对方案的求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们来看看这样一个问题,即著名的最优配对问题

对于空间里有n个点,给定n个点间的距离,将n个点两两配成n/2对,使得所有点对距离之和最小(n<=20)。

对于这样一个问题,我们可以知道这是一个多决策的问题,首先为第1个点作决策进行配对,然后为第2个点进行配对,因此每一个阶段的状态必然包含当前有哪些点参与配对,哪些点未参与配对,而如果将不确定个数和序号的点保存下来呢?答案是集合,我们可以利用二进制的方法,利用二进制法对集合进行表示,第i位为1则表示第i个点参与配对。

于是不难想到用dp[S]表示集合S里的点两两最优配对后的最小距离和,那么dp[S]为S里序号最小的元素与集合S里其他任意元素j匹配后的最小值

即状态转移方程为dp[S]=min(dp[S],dp[S^(1<<i)^(1<<j)]+dist[i][j]);


        for(int S=0;S<(1<<n);S++)
        {
            int i,j;
            dp[S]=0x3f3f3f3f;
            for(i=0;i<n;i++)
                if((1<<i) & S)
                    break;
            for(j=0;j<n;j++)
            {
                if((1<<j) & S)
                    dp[S]=min(dp[S],dp[S^(1<<i)^(1<<j)]+dist[i][j]);
            }

        }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值