UVA - 10911 Forming Quiz Teams(状压DP)
题目链接:https://vjudge.net/problem/UVA-10911
题目大意:给出2 * n个选手的坐标, 要求将所有的选手分成n组, 每组两个人, 所有组的两个人之间的距离之和要小, 输出n组距离和最小值。
AC代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 int N; 7 double DP[1<<17],dis[20][20]; 8 double cal(int x, int y) { 9 return sqrt(x*x+y*y); 10 } 11 double DPS(int S) { 12 if(DP[S]||!S) return DP[S]; 13 int i,j; 14 for(i=N-1; i>=0;i--) 15 if(S&(1<<i)) break; 16 DP[S]=0x3f3f3f3f; 17 for(j=i-1;j>=0;j--) 18 if (S&(1<<j)) DP[S]=min(DP[S],dis[i][j]+DPS(S^(1<<i)^(1<<j))); 19 return DP[S]; 20 } 21 int main() { 22 int x[20],y[20],kase=0; 23 while(scanf("%d", &N),N){ 24 N<<=1; 25 for(int i=0; i<N;i++) 26 scanf("%*s%d%d",&x[i],&y[i]); 27 for (int i=0; i<N;i++) 28 for (int j=i+1; j<N;j++) 29 dis[j][i]=cal(x[i]-x[j],y[i]-y[j]); 30 memset(DP,0,sizeof(DP)); 31 printf("Case %d: %.2lf\n",++kase,DPS((1<<N)-1)); 32 } 33 }