Advertisement
Korotkodul

ДП на подмножествах

Dec 23rd, 2021
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.00 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. const int INF = 1e9;
  8.  
  9. int main() {
  10.     ios_base::sync_with_stdio(false);
  11.     cin.tie(0);
  12.     int n;
  13.     cin >> n;
  14.     vector<vector<int>> gr(n, vector<int>(n));
  15.     for (int i = 0; i < n; ++i) {
  16.         for (int j = 0; j < n; ++j) {
  17.             cin >> gr[i][j];
  18.         }
  19.     }
  20.     vector<vector<int>> dp(1 << n, vector<int>(n, INF));
  21.     for (int i = 0; i < n; ++i) {
  22.         dp[1 << i][i] = 0;
  23.     }
  24.     for (int mask = 1; mask < (1 << n); ++mask) {
  25.         for (int i = 0; i < n; ++i) {
  26.             if (!(mask & (1 << i))) {
  27.                 continue;
  28.             }
  29.             for (int j = 0; j < n; ++j) {
  30.                 if (mask & (1 << j)) {
  31.                     continue;
  32.                 }
  33.                 dp[mask | (1 << j)][j] = min(dp[mask | (1 << j)][j], dp[mask][i] + gr[i][j]);
  34.             }
  35.         }
  36.     }
  37.     cout << *min_element(dp[(1 << n) - 1].begin(), dp[(1 << n) - 1].end()) << '\n';
  38. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement