状态压缩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';
}
posted @ 2024-01-17 09:20  _Yxc  阅读(12)  评论(0)    收藏  举报