Advertisement
splash365

MCM

Oct 7th, 2020 (edited)
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.34 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define     read            freopen("input.txt","r",stdin)
  5. #define     write           freopen("output.txt","w",stdout)
  6.  
  7. const int MAXN = 101;
  8.  
  9. int dp[MAXN][MAXN];
  10.  
  11. int call(int arr[], int i, int j)
  12. {
  13.     if(i == j) return 0;
  14.     if(dp[i][j] != 0) return dp[i][j];
  15.     dp[i][j] = INT_MAX;
  16.     for(int k=i; k<j; k++)
  17.     {
  18.         int x = call(arr, i, k) + call(arr, k + 1, j) + arr[i - 1] * arr[k] * arr[j];
  19.         if(x < dp[i][j])
  20.         {
  21.             dp[i][j] = x;
  22.             dp[j][i] = k;
  23.         }
  24.     }
  25.     return dp[i][j];
  26. }
  27.  
  28. void printParenthesis(int i, int j)
  29. {
  30.     if(i==j)
  31.         cout << "A" << i;
  32.     else
  33.     {
  34.         cout << "(";
  35.         int k = dp[j][i];
  36.         printParenthesis(i, k);
  37.         printParenthesis(k + 1, j);
  38.         cout << ")";
  39.     }
  40. }
  41.  
  42. int main()
  43. {
  44.     read;
  45.     write;
  46.     int n;
  47.     memset(dp, 0,sizeof(dp));
  48.     cin >> n;
  49.     int arr[n];
  50.     for(int i=1; i<=n; ++i)
  51.     {
  52.         cin >> arr[i-1] >> arr[i];
  53.     }
  54.     cout << call(arr,1,n) << endl;
  55.     printParenthesis(1, n);
  56.     cout << endl;
  57.     for (int i = 1; i <= n; i++)
  58.     {
  59.         for (int j = 1; j <= n; j++)
  60.             printf("%7d", dp[i][j]);
  61.         cout << endl;
  62.     }
  63. }
  64.  
  65.  
  66. /*
  67. input from: Cormen - page 376, 377
  68. 6
  69. 30 35
  70. 35 15
  71. 15 5
  72. 5 10
  73. 10 20
  74. 20 25
  75. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement