【状压DP】最优配对问题(jzoj 3420)

最优配对问题

jzoj 3420

题目大意:

在平面上有n个点,现在要把他们拼成n/2对,拼接两个点的代价是他们的平面距离,现在问代价总和最小是多少

输入样例

4
8730 9323
-3374 3929
-7890 -6727
1257 4689

输出样例

20366.60

数据范围

2<=N<=20

解题思路#1:

用dfs每一次选1个数和当前数字匹配,如果当前数字选过了,就进入下一层

代码#1:

#include<cmath>
#include<cstdio>
#define min(a,b) (a)<(b)?(a):(b)
using namespace std;
int n,p[30];
double ans,x[30],y[30];
double dis(int a,int b){return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));}//计算
void dfs(int dep,double sum)
{if (dep>n){ans=min(ans,sum);//尝试更新答案return;}if (sum>=ans) return;//无法更新答案了if (p[dep]) dfs(dep+1,sum);//选过就直接下一层else{for (int i=dep+1;i<=n;++i)if (!p[i]){p[i]=1;dfs(dep+1,sum+dis(dep,i));//选一个和它匹配的数p[i]=0;}}
}
int main()
{scanf("%d",&n);for (int i=1;i<=n;++i)scanf ("%lf %lf",&x[i],&y[i]);ans=9999999999.99;dfs(1,0.0);printf("%.2lf",ans);
}

解题思路#2:

用bfs先造出一个状压模型,然后用模型进行状压DP

代码#2:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#define min(a,b) (a)<(b)?(a):(b)
using namespace std;
int n,tail=1,q[1<<21];
double x[30],y[30],f[1<<21];
int pd(int x,int y){return x&(1<<y);}
double dis(int a,int b){return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));}
void bfs()//制造模型
{q[1]=0;int h,head=0;while(head<tail){h=q[++head];int i=n-1;for (;i>=0;--i)if (pd(h,i)) break;//找一个最高位的1for (int j=n-1;j>i;--j)//在最高位后面加1q[++tail]=h|(1<<j);}
}
void dp()
{for (int i=1;i<=tail;++i){int s=q[i];int j=n-1;for (;j>=0;--j)if (!pd(s,j)) break;//找最高位的0for (int k=0;k<j;++k)//找一个和它相匹配的数if (!pd(s,k))f[s|(1<<j)|(1<<k)]=min(f[s|(1<<j)|(1<<k)],f[s]+dis(j,k));//状压DP}
}
int main()
{scanf("%d",&n);for (int i=0;i<n;++i)scanf("%lf %lf",&x[i],&y[i]);memset(f,0x7f,sizeof(f));f[0]=0;bfs();dp();printf("%.2lf",f[(1<<n)-1]);//输出
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据告诉你:中年并不只有危机,创业或许正当时

人们普遍认为最成功的企业家都是年轻人。比尔?盖茨、史蒂夫?乔布斯和马克?扎克伯格都在自己20岁出头的时候&#xff0c;建立起了日后改变世界的伟大公司。这些著名的案例是否反映了一种可以被普遍推广的模式呢&#xff1f;风险投资机构和媒体似乎赞成一点。我们分析了过去十…

HDU6223 - Infinite Fraction Path

HDU6223 - Infinite Fraction Path 做法1&#xff1a;枚举每个串取最大值&#xff0c;只用判断前20位&#xff0c;如果前20位都相同&#xff0c;可以认定两个串相同。因为很容易进入循环节&#xff0c;且循环节不太大。 #include <bits/stdc.h> #define pb push_back typ…

P4219-[BJOI2014]大融合【LCT】

正题 题目链接:https://www.luogu.com.cn/problem/P4219 题目大意 nnn个点&#xff0c;每次有操作 加入一条边&#xff0c;保证该边连接了两个不同的连通块询问经过一条边的路径数量 解题思路 考虑如何用LCTLCTLCT维护虚子树信息&#xff0c;只要在断边的时候把虚子树的信息…

【区间DP】甲虫(luogu 4870)

甲虫 luogu 4870 题目大意&#xff1a; 在一个坐标轴上有n个露珠&#xff0c;每个露珠有m个水分&#xff0c;露珠会每隔一个时间单位就消失一点水分&#xff0c;现在有一只甲虫从原点出发&#xff0c;甲虫的移动速度是一个单位时间移动一个单位的距离&#xff0c;甲虫没碰到…

GYM 101669F - Binary Transformations

GYM 101669F - Binary Transformations 做法&#xff1a;如果不存在一个位置p \((a[p]1,b[p]1)\)&#xff0c;那么答案就是贪心的先把所有的1&#xff0c;按价值从大到小变为0,所有的0,按价值从小到大变为1。如果存在一些位置p&#xff0c;我们就枚举一开始把多少p转成0,显然价…

2020牛客NOIP赛前集训营-提高组(第六场)A-袜子分配【组合数学,结论】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7615/A?&headNavacm&headNavacm 题目大意 nnn对颜色一样的袜子&#xff0c;每次随机拿出两个&#xff0c;求拿完之后颜色一样的期望对数。 解题思路 考虑一对袜子的贡献&#xff0c;因为这一对要绑在一起所以贡献…

【线段树】FREQUENT - Frequent values(luogu-SP1684 / poj 3368)

FREQUENT - Frequent values luogu-SP1684 poj 3368 题目大意&#xff1a; 有一个单调不降序列&#xff0c;让你求出某些区间内的出现次数最多的数出现的次数&#xff08;有多组数据&#xff0c;以0结尾&#xff09; 输入样例 10 3 -1 -1 1 1 1 1 3 10 10 10 2 3 1 10 5 …

ASP.NET Core 2.0 MVC项目实战

一、前言毕业后入职现在的公司快有一个月了&#xff0c;公司主要的产品用的是C/S架构&#xff0c;再加上自己现在还在学习维护很老的delphi项目&#xff0c;还是有很多不情愿的。之前实习时主要是做.NET的B/S架构的项目&#xff0c;主要还是用的那种传统的开发模式&#xff0c;…

Codeforces1045I

Codeforces1045I 做法&#xff1a;如果至多有一种字母出现奇数次&#xff0c;则合法&#xff0c;因此把整个串用一个26位2进制数表示&#xff0c;对于每一个数&#xff0c;枚举可能的对应串的状态即可。 #include <bits/stdc.h> typedef long long ll; inline int read()…

[2020.10.30NOIP模拟赛]字符串水题【SA,树状数组】

正题 题目大意 一个字符串SSS。 若干个询问&#xff0c;每次询问一个串TTT和l,rl,rl,r。询问有多少个TTT和SSS的公共子串满足和为[l,r][l,r][l,r] 解题思路 考虑枚举子串左端&#xff0c;那么右串一定在一个范围内&#xff0c;考虑如何求出一个范围。 考虑用后缀数组解决这…

开始水题发博客

以后每次能AC CodeForces的题&#xff0c;就发一次博客 尽量带讲解吧。。 我这人很懒的。。 日期 0:32 2019-10-12

WebApiClient百度地图服务接口实践

1. 文章目的随着WebApiClient的不断完善&#xff0c;越来越多开发者选择WebApiClient替换原生的HttpClient&#xff0c;然而在应用到实际项目中多多少少会遇到一些项目结合上的疑问和困难&#xff0c;本文将以WebApiClient使用者的身份&#xff0c;在Asp.net core mvc项目中使用…

【DP】数字游戏(jzoj 2131)

数字游戏 jzoj 2131 题目大意&#xff1a; 有n个数&#xff0c;每个数有相应的aia_iai​和bib_ibi​&#xff0c;当选了一个数后结果加上aia_iai​,其他数分别减去他们自己的aja_jaj​&#xff0c;现在让你选m个数&#xff0c;结果最大是多少 输入样例 3 3 10 20 30 4 5 6…

Codeforces1045G

Codeforces1045G 做法&#xff1a;按半径r从大到小枚举&#xff0c;对于每个q&#xff0c;枚举对应位置可能的q值&#xff0c;对每个q&#xff0c;维护出现的坐标x&#xff0c;每次查询半径内的已经出现的坐标的数目即可。需要实现一个插入单点加&#xff0c;查询区间和的操作&…

[2020.10.30NOIP模拟赛]小鱼吃大鱼【RMQ】

正题 题目大意 nnn个数&#xff0c;求一对(i,j)(i,j)(i,j)要求最大化max{ai,aj}%min{ai,aj}max\{a_i,a_j\}\% min\{a_i,a_j\}max{ai​,aj​}%min{ai​,aj​} 解题思路 我们考虑枚举小的那一个iii&#xff0c;显然在ki∼k(i1)−1ki\sim k(i1)-1ki∼k(i1)−1这段范围都是要减去一…

CodeForces 1191A---Tokitsukaze and Enhancement

原题链接 Describe: Tokitsukaze is one of the characters in the game “Kantai Collection”. In this game, every character has a common attribute — health points, shortened to HP. In general, different values of HP are grouped into 4 categories: Category A…

Dependency injection in .NET Core的最佳实践

我们知道依赖注入&#xff08;DI&#xff09;是一种实现对象及其协作者或依赖关系之间松散耦合的技术。 ASP.NET Core包含一个简单的内建容器来支持构造器注入。我们试图将DI的最佳实践带到.NET Core应用程序中&#xff0c;这表现在以下方面&#xff1a;构造器注入注册组件DI i…

【状压DP】剑之修炼(jzoj 2130)

剑之修炼 jzoj 2130 题目大意&#xff1a; 在一个位置上有一个人&#xff0c;同时还有NNN&#xff08;N⩽10N \leqslant 10N⩽10&#xff09;个怪物&#xff0c;这个人会不停地释放技能&#xff0c;技能可以瞬间杀死周围8个格子上的怪物&#xff0c;行走速度是每个单位时间走…

GYM 101908F - Music Festival

GYM 101908F - Music Festival 做法&#xff1a;将节目按照右端点排序&#xff0c;\(dp[i][st][0/1]\)表示前i个节目&#xff0c;选择的stage的状态用一个n位二进制数表示为st&#xff0c;第i个节目选或不选的最大值&#xff0c;转移时用线段树优化一下。 #include <bits/st…

CodeForces - 1189A ----Keanu Reeves

原题传送 INPUT Output Examples 题意&#xff1a; 有个长度我n的字符串&#xff0c;然后把它分成k分&#xff0c;要使每份都good且为正数&#xff08;good的要求为该数中0和1的个数不同&#xff09;&#xff0c;求输出最小的结果&#xff08;答案不唯一输出一个即可&#xf…