P1433 吃奶酪 状压dp
作者:
多米尼克領主的致意
,
2024-05-19 20:49:18
,
所有人可见
,
阅读 3
code:
#include <bits/stdc++.h>
using namespace std;
int n;
double x[20], y[20];
double f[1 << 20][20];
double dist[20][20];
double distance(int a, int b){
return sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) * (y[a] - y[b]));
}
int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);
// cout.tie(0);
cin >> n;
for(int i = 1;i <= n;i++){
cin >> x[i] >> y[i];
}
memset(f, 127, sizeof f);
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
dist[i][j] = distance(i, j);
// cout << dist[i][j] << endl;
dist[j][i] = dist[i][j];
}
}
for(int i = 0;i <= n;i++){
f[1 << i][i] = dist[0][i];
}
for(int s = 0; s < (1 << n + 1);s++){
for(int i = 0;i <= n;i++){
// if(s == (1 << i))f[s][i] = 0;
if((s >> i) & 1){
for(int k = 0;k <= n;k++){
if(((s^(1 << i)) >> k) & 1){
// cout << dist[i][k] << endl;
f[s][i] = min(f[s][i], f[s^(1 << i)][k] + dist[i][k]);
}
}
}
}
}
double mn = f[0][0];
// cout << mn << endl;
for(int i = 0;i <= n;i++){
cout << f[(1 << n) - 1][i] << endl;
mn = min(mn, f[(1 << n) - 1][i]);
}
printf("%.2f", mn);
return 0;
}