状态压缩DP->吃奶酪(洛谷1433)

题意:二维平面内n个糖果,问吃完所有糖果走的最小距离。 初始时坐标为0,0。 n <= 15

分析:经典状压模板题。

void solve(){
int n;
cin >> n;

vector<pair<double, double>> a(n);
for (auto& x : a){
cin >> x.first >> x.second;
}

auto getDist = [](pair<double, double> a, pair<double, double> b) -> double{
return sqrt((a.first - b.first) * (a.first - b.first) + (a.second - b.second) * (a.second - b.second));
};

vector<vector> dp(1 << n, vector (n, 1e9));
for (int i = 0; i < n; ++i){
dp[1 << i][i] = getDist(make_pair(0.0, 0.0), a[i]);
}

for (int i = 0; i < (1 << n); ++i){
for (int j = 0; j < n; ++j){
if ((i >> j) & 1){
for (int k = 0; k < n; ++k){
if (k != j && ((i >> k) & 1)){
dp[i][j] = min(dp[i][j], dp[i - (1 << j)][k] + getDist(a[k], a[j]));
}
}
}
}
}

cout << fixed << setprecision(2) << *min_element(dp[(1 << n) - 1].begin(), dp[(1 << n) - 1].end()) << '\n';
}

posted @ 2024-01-17 09:20  _Yxc  阅读(45)  评论(0)    收藏  举报