状态压缩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<double>> dp(1 << n, vector<double> (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';
}

浙公网安备 33010602011771号