AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 问答
    • 吐槽
  • App
  • 登录/注册

洛谷 P1171. 售货员的难题    原题链接    困难

作者: 作者的头像   Welsh_Powell ,  2023-03-16 01:57:10 ,  所有人可见 ,  阅读 48


2


1

算法

(状压dp) $O(n \cdot 2^n)$

本题是状压dp入门题,做法和 ABC180E 基本一样

C++ 代码

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;

inline void chmin(int& x, int y) { if (x > y) x = y; }

int main() {
    int n;
    cin >> n;

    int n2 = 1<<n;
    const int INF = 1001001001;
    vector dp(n2, vector<int>(n, INF));
    vector dist(n, vector<int>(n));
    rep(i, n)rep(j, n) cin >> dist[i][j];
    for (int i = 1; i < n; ++i) {
        dp[1<<i][i] = dist[0][i];
    } 

    for (int s = 0; s < n2; s += 2) {
        rep(v, n) {
            if (~s>>v&1) continue;
            rep(u, n) {
                if (s>>u&1) continue;
                chmin(dp[s|1<<u][u], dp[s][v]+dist[v][u]);
            }
        }
    }

    cout << dp[n2-1][0] << '\n';

    return 0;
}

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息