main.cc 662 B

123456789101112131415161718192021222324252627
  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. const int N = 16;
  6. int w[N][N];
  7. int dp[1 << N][N];
  8. int n;
  9. int main() {
  10. scanf("%d", &n);
  11. for (int i = 0; i < n; i++)
  12. for (int j = 0; j < n; j++) scanf("%d", &w[i][j]);
  13. memset(dp, 0x3F, sizeof(dp)); // Set dp[i][j] as 0x3F3F3F3F
  14. dp[1][0] = 0;
  15. for (int i = 1, fin = (1 << n) - 1; i <= fin; i++)
  16. for (int j = 0, j_ = 1; j < n; j++, j_ <<= 1)
  17. if (j_ & i)
  18. for (int k = 0, k_ = 1; k < n; k++, k_ <<= 1)
  19. if (k_ & i && k != j)
  20. dp[i][k] = min(dp[i][k], dp[i ^ k_][j] + w[j][k]);
  21. printf("%d\n", dp[(1 << n) - 1][n - 1]);
  22. return 0;
  23. }