Cod sursa(job #1665713)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 27 martie 2016 12:01:18
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 500;
const unsigned long long INF = numeric_limits <unsigned long long> :: max();

unsigned long long D[MAX_N * (MAX_N + 1) >> 1];
int V[MAX_N + 1];
int X[MAX_N];

#define W(A, B) (X[(B)] + (A))

int main() {
  freopen("podm.in", "r", stdin);
  freopen("podm.out", "w", stdout);

  int N;

  scanf("%d", &N);

  for (int i = 0; i <= N; ++ i) {
    scanf("%d", V + i);
    X[i] = (i * (i + 1)) >> 1;
  }
  fclose(stdin);

  for (int j = 1; j < N; ++ j) {
    for (int i = j - 1; i >= 0; -- i) {
      D[W(i, j)] = INF;
      for (int k = i + 1; k <= j; ++ k) {
        D[W(i, j)] = min(D[W(i, j)], D[W(i, k - 1)] + D[W(k, j)] + 1ULL * V[i] * V[k] * V[j + 1]);
      }
    }
  }

  printf("%llu\n", D[W(0, N - 1)]);
  fclose(stdout);

  return 0;
}