Alex_tz307

Cherchez vol 2 - Evaluare Optimala - pag 180

Sep 23rd, 2020
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define INF 0x3f3f3f3f
  3.  
  4. using namespace std;
  5.  
  6. void afisare(int i, int j, vector < vector < int > >& dp, vector < int >& a) {
  7.     if(i == dp[j][i])
  8.         cout << a[i];
  9.     else {
  10.         cout << "(";
  11.         afisare(i, dp[j][i], dp, a);
  12.         cout << ")";
  13.     }
  14.     cout << "o";
  15.     if(j == dp[j][i] + 1)
  16.         cout << a[j];
  17.     else {
  18.         cout << "(";
  19.         afisare(dp[j][i] + 1, j, dp, a);
  20.         cout << ")";
  21.     }
  22. }
  23.  
  24. int main() {
  25.     ios_base::sync_with_stdio(false);
  26.     cin.tie(nullptr);
  27.     cout.tie(nullptr);
  28.     int N, M;
  29.     cin >> N >> M;
  30.     vector < int > a(N + 1);
  31.     for(int i = 1; i <= M; ++i)
  32.         cin >> a[i];
  33.     vector < vector < int > > op(N + 1, vector < int >(N + 1));
  34.     for(int i = 1; i <= N; ++i)
  35.         for(int j = 1; j <= N; ++j)
  36.             cin >> op[i][j];
  37.     vector < vector < int > > cost(N + 1, vector < int >(N + 1));
  38.     for(int i = 1; i <= N; ++i)
  39.         for(int j = 1; j <= N; ++j)
  40.             cin >> cost[i][j];
  41.     vector < vector < int > > dp(M + 1, vector < int >(M + 1)),
  42.                               rez(M + 1, vector < int >(M + 1));
  43.     for(int i = 1; i <= M; ++i)
  44.         rez[i][i] = a[i];
  45.     for(int lg = 2; lg <= M; ++lg)
  46.         for(int i = 1; i <= M - lg + 1; ++i) {
  47.             int j = i + lg - 1, mn = INF, kmin;
  48.             for(int k = i; k < j; ++k)
  49.                 if(mn > dp[i][k] + dp[k + 1][j] + cost[rez[i][k]][rez[k + 1][j]]) {
  50.                     mn = dp[i][k] + dp[k + 1][j] + cost[rez[i][k]][rez[k + 1][j]];
  51.                     kmin = k;
  52.                 }
  53.             dp[i][j] = mn;
  54.             dp[j][i] = kmin;
  55.             rez[i][j] = op[rez[i][kmin]][rez[kmin + 1][j]];
  56.         }
  57.     cout << dp[1][M] << '\n';
  58.     afisare(1, M, dp, a);
  59. }
  60.  
Advertisement
Add Comment
Please, Sign In to add comment