#include <iostream>
//#include <stdio.h>
#include <math.h>
#include <cmath>
#include <string.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <fstream>
#include <string>
#include <map>
#include <unordered_map>
#define rd read()
#define il inline
#define ll long long
using namespace std;
double dp[1 << 16][20];
const ll big = 1e14;
struct point{
double x, y, len;
}p[20];
il double dis(int x, int y)
{
int a = abs(p[x].x - p[y].x), b = abs(p[x].y - p[y].y);
double sum = a * a + b * b;
return sqrt(sum);
}
int main(){
int n;
cin >> n;
double x, y;
for(int i = 0; i < n; ++i)
{
cin >> x >> y;
p[i].x = x; p[i].y = y;
p[i].len = sqrt(abs(x) * abs(x) + abs(y) * abs(y));
}
for(int i = 0; i < (1 << n); ++i)
{
for(int j = 0; j < n; ++j) dp[i][j] = big;
}
for(int i = 0; i < n; ++i)
{
dp[(1 << i)][i] = p[i].len;
}
//dp[0][0] = 0;
for(int i = 0; i < (1 << n); ++i)
{
for(int j = 0; j < n; ++j)
{
if(i & (1 << j))
{
for(int k = 0; k < n; ++k)
{
if(i & (1 << k)) continue;
dp[i | (1 << k)][k] = min(dp[i][j] + dis(j, k), dp[i | (1 << k)][k]);
}
}
}
}
double _min = big + 10;
ll l = 1 << n;
for(int i = 0; i < n; ++i) _min = min(_min, dp[l - 1][i]);
printf("%.2lf\n", _min);
return 0;
}
用了浮点数读入,然后dp数组也初始化了比较大的值,实在没找出来哪里错了orz(调了好久),dalao们可以帮忙看看吗,谢谢了
//放组例子(#9)
// in
13
-6 1
-6 0
-5 0
-4 0
-3 0
-2 0
-1 0
1.1 0
2 0
3 0
4 0
5 0
6 0
// out
19.00