Cod sursa(job #3031987)

Utilizator iProgramInCppiProgramInCpp iProgramInCpp Data 21 martie 2023 10:58:56
Problema Parantezare optima de matrici Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("podm.in");
ofstream fout("podm.out");
long long P[501][501];
long long S[501], N;

int main()
{
    fin >> N;
    for (int i=1; i<=N+1; i++)
        fin >> S[i];

    // caz banal: Inmultirea A[i] cu A[i+1].
    // Efortul este NL(A[i]) * NC(A[i]) * NC(A[i+1]).
    // (unde NL(mat) = numarul de linii al unei matrici, iar NC(mat) este nr de coloane)
    for (int i=1; i<N; i++)
    {
        // NL(A[i]) = S[i]
        // NC(A[i]) = S[i+1].
        P[i][i+1] = S[i]*S[i+1]*S[i+2];
    }

    // diagonala principala initializata cu 0. Nu necesita efort, deoarece deja avem matricea pregatita :)

    // pentru fiecare diagonala dupa cea principala (inmultirea elementelor A[i]*A[i+1]...A[i+d-1])
    for (int d=3; d<=N; d++)
    {
        for (int i=1, j=d; j<=N; i++,j++)
        {
            // verificam fiecare grup (A[i]...A[k]) * (A[k+1]...A[j])
            // am calculat deja efortul minim pentru (A[i]...A[k]) si (A[k+1]...A[j]).
            // In bucla 'for' de mai jos, se determina ce modalitate
            // (A[i]...A[k])(A[k+1]...A[j]) ne va oferi cazul minim pentru (A[i]...A[j]).
            long long m = 9e18;
            for (int k=i; k<j; k++)
            {
                m = min(m, P[i][k] + P[k+1][j] + S[i] * S[k+1] * S[j+1]);
            }
            P[i][j] = m;
        }
    }

    // cazul A[1]*A[2]...A[N].
    fout << P[1][N];

    return 0;
}