hlg 2130 状压dp
2016-04-18 23:36
429 查看
基本的状压dp 需要注意的是两点之间直线最短 所以不需要进行floyd
由于把dp的memset放在了初始化0的后面de了好久的bug..
由于把dp的memset放在了初始化0的后面de了好久的bug..
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<map> using namespace std; #define eqs 0.000000001 struct node { double x; double y; }; node a[20]; double f[20][20]; double dp[1<<17][20]; int main(){ int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); memset(f,0,sizeof(f)); for(int i=0;i<n;i++) { scanf("%lf%lf",&a[i].x,&a[i].y); } for(int i=0;i<n;i++) { for(int k=0;k<n;k++) { f[i][k]=f[k][i]=sqrt((a[i].x-a[k].x)*(a[i].x-a[k].x)+(a[i].y-a[k].y)*(a[i].y-a[k].y)); } } int l=(1<<n)-1; memset(dp,0x7f,sizeof(dp)); for(int i=0;i<n;i++) { dp[1<<i][i]=0; } for(int s=0;s<=l;s++) { for(int i=0;i<n;i++) { if((s&(1<<i))==0) continue; for(int k=0;k<n;k++) { if((s&(1<<k))!=0) continue; dp[s+(1<<k)][k]=min(dp[s+(1<<k)][k],dp[s][i]+f[i][k]); } } } double ans=1e300; for(int i=0;i<n;i++) { ans=min(dp[l][i],ans); } printf("%.2f\n",ans); } }
相关文章推荐
- 1001 and 1002 of search
- activity间传递数据
- 《八声甘州》--武汉
- CMake 调用 Shell 脚本
- mybatis获取mysql自增的id值
- ccc 单点触控
- leetcode——链表reorder
- NetscalerSSL证书的导入和link
- 心急的C小加
- 因子分析
- linux信号量使用
- (LeetCode 101) Symmetric Tree
- 9.1.4 什么样数据类型可以打包和解包
- MySQL索引原理
- 9.1.4 什么样数据类型可以打包和解包
- 作业5
- layer
- 使用axes函数在matlab绘图中实现图中图的绘制
- 面试题06:在二元树中找出和为某一值的所有路径(未完待续)
- OSGI框架学习