题目

传送们

思路

1≤n≤15,妥妥的状压,数据这么小,

这道题的状压思路还是很好想的,我们定义f[i][s]代表以i为起点,吃掉状态为s的奶酪所需要跑的最短距离,那么显然,我们先枚举状态s,然后枚举出发点i,判断合法性(s是否包括i),然后枚举所需加入的起点j(s如果包含j则跳过),然后就可以很自然的推出转移方程

f[i][s]=min(f[i][s],f[j][s-(1<<(i-1))]+dis(i,j));

最后不要忘记加上出发点(0,0)就行了。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1<<16;
double f[20][maxn];
double x[20],y[20];
double dis(int i,int j){
double ans=0;
ans=sqrt((double)((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])));
return ans;
}
int main(){
int n;scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
}
int lim=1<<n;
memset(f,0x7f,sizeof(f));
for(int i=1;i<=n;i++){
f[i][1<<(i-1)]=0;
}
for(int s=0;s<lim;s++){
for(int i=1;i<=n;i++){
if((s&(1<<(i-1)))==0)continue;
for(int j=1;j<=n;j++){
if(((s&(1<<(j-1)))==0)||i==j)continue;
f[i][s]=min(f[i][s],f[j][s-(1<<(i-1))]+dis(i,j));
}
}
}
double ans=-1;
for(int i=1;i<=n;i++){
double s=f[i][(1<<n)-1]+dis(i,0);
if(ans==-1||ans>s) ans=s;
}
printf("%.2lf\n",ans);
return 0;
}

最新文章

  1. 面向初学者之烦人的mainactivity启动前的actionBAR
  2. RAID简述
  3. PHP类与继承
  4. android上传文件到wamp服务器
  5. [Sciter系列] MFC下的Sciter&ndash;4.HTML与图片资源内置
  6. 修改UISearBar的文字颜色,placehoder颜色及输入框颜色
  7. 非正式js语法
  8. MySQL UPDATE
  9. VueJs一些资料网站链接
  10. Find all factorial numbers less than or equal to N
  11. 论文笔记(8):BING: Binarized Normed Gradients for Objectness Estimation at 300fps
  12. 限制UITextField的输入字数(长度)最正确的方法
  13. Python开发【第十一篇】:Python操作MySQL
  14. hql- 使用like的小坑①
  15. c函数指针
  16. 当你想要在conda指定的某个环境中安装包的方法
  17. Goodbye Wuxu.B.新年的Dog划分(交互 二分 二分图)
  18. 获取CPU ID--查看CPU数量/核数
  19. laravel中的Auth认证:
  20. leetCode题解之删除单链表中指定的元素

热门文章

  1. BigDecimal的setScale常用方法(ROUND_UP、ROUND_DOWN、ROUND_HALF_UP、ROUND_HALF_DOWN)
  2. CentOS7 yum 安装配置 MySQL 5.7
  3. Python3和Python2中int和long的区别?
  4. 大话计算机网络一 聊聊UDP
  5. MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试
  6. javascript 面向对象学习(二)——原型与继承
  7. ubuntu12.04 empathy添加qq登陆
  8. 关于Api的那些事儿!
  9. 怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏
  10. @bzoj - 2595@ 游览计划