加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

状态压缩dp 最优配对问题

发布时间:2020-12-13 20:44:41 所属栏目:PHP教程 来源:网络整理
导读:在空间中的n(n为偶数)个点,配成n对,然后使得每个点在1个点对中。所有的点对的距离之和最小 #include cstdio#include iostream#include algorithm#include queue#include stack#include climits#include cstring#include cmath#include map#include set#d

在空间中的n(n为偶数)个点,配成n对,然后使得每个点在1个点对中。所有的点对的距离之和最小

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <climits> #include <cstring> #include <cmath> #include <map> #include <set> #define INF 100000000 using namespace std; int n; int x[1000]; int y[1000]; int d[1<< 21]; int dist(int a,int b){ return (x[a] - x[b])*(x[a]-x[b]) + (y[a]-y[b])*(y[a] - y[b]); } int main(){ while(cin >> n){ for(int i = 0;i < n;i++){ cin >> x[i] >> y[i]; } memset(d,sizeof(d)); for(int i = 0;i < (1<<n);i++){ d[i] = INF; } d[0] = 0; //顺次枚举不同的集合 for(int s = 0;s < (1<<n);s++){ int i,j; //d[s] = min(|PiPj| + d[s-{i}-{j}]); for(i = 0;i < n;i++){ //枚举其中1个点 if(s & (1 << i)) break; } for(j = i+1;j < n;j++){ //再找另外1个点 if(s & (1 << j)){ //比较去掉这两个点的集合最小值的方法 d[s] = min(d[s],dist(i,j)+d[s^(1<<i)^(1<<j)]); } } } printf("%d ",d[(1 << n)⑴]); } return 0; }

觉得的状态紧缩dp合适于n较小但是状态异常复杂的dp环境

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读