1 条题解

  • 0
    @ 2024-9-3 23:27:34
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 21, inf = 0x3f3f3f3f;
    int n, m, a[N][N], dp[1 << N][N];
    
    /*
    状态:dp[i][j] 表示已经经过i集合的点,且最后在j点的最短 Hamilton 路径的长度.
    初始化:dp[i][j]=inf, dp[i][i]=0
    转移:k->j, dp[i][j] = min(dp[i][j], dp[i^(1<<j)][k]+a[k][j]);
    目标:dp[(1<<n)-1][n-1]
    */
    int main() {
        cin >> n;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++) cin >> a[i][j];
        memset(dp, 0x3f, sizeof dp);
        dp[1][0] = 0;
        for (int i = 1; i < (1 << n); i++)
            for (int j = 0; j < n; j++) if (i >> j & 1)
                for (int k = 0; k < n; k++) if (i ^ (1 << j) >> k & 1)
                    dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][k] + a[k][j]);
        cout << dp[(1 << n) - 1][n - 1] << endl;
    }
    
    • 1

    信息

    ID
    1429
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者