标签:dp
只想说开始没想用dfs的 感觉麻烦 后来超时超的不行了 没办法 就怕遇到这卡时间的 ,其中还有个优化 就是在排序上
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<cmath> using namespace std; double dp[1<<20]; double num[25][25]; int n,starx,stary; struct node { int x,y; }coord[30]; double dis(int x1,int y1,int x2,int y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } bool cmp(node a,node b) { return dis(starx,stary,a.x,a.y)<dis(starx,stary,b.x,b.y); } double min(double a,double b) { return a<b?a:b; } double dfs(int state,int cont) { if(dp[state]>=0) return dp[state]; if(cont==n) return 0; int s=state; int k=-1; double d; dp[state]=99999999; for(int i=0;s;s/=2,i++) { if(s&1==1) { if(k==-1) { k=i; d=dis(starx,stary,coord[k].x,coord[k].y); } else { int t=i; dp[state]=min(dp[state],dfs(state-(1<<k)-(1<<t),cont+2)+num[k][t]+d); } } } return dp[state]; } int main() { int T,i,j,p=1; scanf("%d",&T); while(T--) { scanf("%d%d",&starx,&stary); scanf("%d",&n); n*=2; for(i=0;i<n;i++) scanf("%d%d",&coord[i].x,&coord[i].y); sort(coord,coord+n,cmp); for(i=0;i<n;i++) for(j=0;j<n;j++) num[i][j]=dis(coord[i].x,coord[i].y,coord[j].x,coord[j].y); int k=(1<<n)-1; memset(dp,-1,sizeof(dp)); double Min=dfs(k,0); printf("Case #%d: %.2lf\n",p++,Min); } return 0; }
标签:dp
原文地址:http://blog.csdn.net/zxf654073270/article/details/44984867