Pagini recente » Cod sursa (job #167440) | Statistici Visanu Adrian (Visanu_Adrian_321CC) | Cod sursa (job #320814) | Cod sursa (job #202349) | Cod sursa (job #1750396)
#include <stdio.h>
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main() {
freopen("podm.in", "r", stdin);
freopen("podm.out", "w", stdout);
int N, a;
scanf("%d", &N);
vector<int> dims, aux(505);
vector<vector<int> > D(505, aux); //D(i, j) = numarul min de inmultiri intre matricile
// i si j
if (N + 1 == 2)
return 0;
for (int i = 0; i <= N; i ++) {
scanf("%d", &a);
dims.push_back(a);
}
for (int i = 1; i <= N; i ++) //umple diagonala
D[i][i] = 0;
for (int i = 1; i <= N - 1; i ++)
D[i][i + 1] = dims[i] * dims[i + 1] * dims[i - 1]; //umple linia de deasupra diagonalei
for (int w = 2; w <= N - 1; w ++)
for (int i = 1; i <= N - w; i ++) { //umple matricea deasupra a ce am umplut pana acum
int j = i + w, min = INT_MAX;
for (int k = i; k < j; k ++) //=> matrice superior triunghiulara, ca inferior
if (D[i][k] + D[k + 1][j] + dims[k] * dims[i - 1] * dims[j] < min) // ar fi (2, 1)..., care nu sunt intervale valide
min = D[i][k] + D[k + 1][j] + dims[k] * dims[i - 1] * dims[j];
D[i][j] = min;
}
printf("%d\n", D[1][N]);
return 0;
}