Cod sursa(job #2772267)

Utilizator radu.z5Zamfirescu Radu Ioan radu.z5 Data 31 august 2021 15:44:07
Problema Parantezare optima de matrici Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>

using namespace std;

unsigned long podm(const int *d, const int n) {
    int i, j, k;
    unsigned long m[n][n];

    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            m[i][j] = 0UL;

    // d[i] = nr de linii pentru matricea i,
    // d[i + 1] = nr de coloane pentru matricea i
    for (i = 0; i < n - 1; i++)
        m[i][i + 1] = 1UL * d[i] * d[i + 1] * d[i + 2];

    // calculez m[i][i + k]
    for (k = 2; k <= n - 1; k++) {
        // lungimea unei diagonale e n - k la un pas
        for (i = 0; i < n - k; i++) {
            unsigned long minCost = m[i][i] + m[i + 1][i + k]
                    +  1UL * d[i] * d[i + 1] * d[i + k + 1];
            for (j = 1; j <= k - 1; j++) {
                unsigned long q = m[i][i + j] + m[i + j + 1][i + k];
                q += 1UL * d[i] * d[i + j + 1] * d[i + k + 1];

                if (q < minCost)
                    minCost = q;
            }
            m[i][i + k] = minCost;
        }
    }

    return m[0][n - 1];
}

int main(void) {
    ifstream in("podm.in");
    ofstream out("podm.out");

    int n;
    in >> n;
    int d[n + 1];

    for (int i = 0; i <= n; i++)
        in >> d[i];

    out << podm(d, n);

    in.close();
    out.close();
    return 0;
}