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 }
View Code

猜你喜欢

转载自www.cnblogs.com/djh0709/p/9588350.html