zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    08-Linux命令【rm】
    07-Linux命令【mv】
    06-Linux命令【cp】
    05-Linux命令【rmdir】
    04-Linux命令【mkdir】
    03-Linux命令【ls】
    02-Linux命令【cd】
    01-Linux命令【pwd】
    智慧城市3D园区
    自我觉醒
  • 原文地址:https://www.cnblogs.com/djh0709/p/9588350.html
Copyright © 2011-2022 走看看