Pagini recente » Profil stoian.ilinca | Cod sursa (job #1420932)
#include <fstream>
#include <limits>
#define MAXN 502
void citeste_date_despre_matrici(int *N, int *p)
{
std::ifstream in("podm.in");
in >> *N;
for (int i = 0; i <= (*N); i++) in >> p[i];
}
void parantezare_optima_matrici(int N, int *p, long long (*m)[MAXN])
{
int i;
for (i = 1; i <= N; i++)
m[i][i] = 0; // parantezare de matrici in grupuri de cate 1
int offset, j, k;
for (offset = 2; offset <= N; offset++) {
for (i = 1; i <= N - offset + 1; i++) {
j = i + offset - 1;
m[i][j] = std::numeric_limits<long long>::max();
for (k = i; k <= j - 1; k++) {
int aux = m[i][k] + m[k + 1][j] + 1LL * p[i - 1] * p[k] * p[j];
if (m[i][j] > aux) m[i][j] = aux;
}
}
}
}
int main()
{
int N; // numarul de matrici ce trebuiesc inmultite
int p[MAXN]; // dimensiunile fiecarei matrice: A[i] -> p[i - 1] x p[i]
citeste_date_despre_matrici(&N, p);
long long m[MAXN][MAXN];
/**
* m[i][j] = numarul minim de inmultiri efectuate pentru a inmulti sirul de
* matrici cu indicii cuprinsi intre i...j, unde 1 <= i <= j <= N
* Obs.: m[i][j] se descompune in m[i][k] + m[k + 1][j] + p[i - 1] * p[j] * p[k],
* unde k este astfel ales incat m[i][j] sa fie minim
* Exemplu: m[1][N] = costul minim necesar inmultirii matricelor 1..k + cel necesar
* inmultirii matricelor (k + 1)..N, la care se adauga costul inmultirii ultimelor
* doua matrice rezultate prin inmultirea primelor k si a celorlalte (k+1)..N
*/
parantezare_optima_matrici(N, p, m);
std::ofstream out("podm.out");
out << m[1][N];
return 0;
}