Cod sursa(job #1393266)

Utilizator dinuandAndrei-Mario Dinu dinuand Data 19 martie 2015 11:27:43
Problema Parantezare optima de matrici Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#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;
}