Cod sursa(job #3330125)

Utilizator Stefanstef99Stefan Puica Stefanstef99 Data 17 decembrie 2025 17:58:17
Problema Parantezare optima de matrici Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("podm.in");
ofstream fout("podm.out");

/**
4
a = 13 5 89 3 34

A1(13, 5) A2(5,89) A3(89,3) A4(3,34)

((A1 x A2) x A3) x A4 = 13*5*89 + 13*89*3 + 13*3*34
(A1 x (A2 x A3)) x A4 = 5*89*3 + 13*5*3 + 13*3*34

C(n, p) = A(n, m) x B(m, p)
O(n * m * p)
c[i][j] = a[i][1] * b[1][j] + a[i][2]*b[2][j] + ...
         + a[i][m] * b[m][j]

dp[i,j] = costul minim pentru a inmulti Ai x A[i+1] ... x Aj
Sol: dp[1][n]

A1(a[0], a[1]), A2(a[1], a[2]), ..., Ai (a[i-1],a[i])

Date initiale: dp[i][i] = 0
               dp[i][i+1] = a[i-1]*a[i]*a[i+1]
Recurenta:

dp[i][j] = Ai x (A[i+1] x .. x A[j])
           (Ai x A[i+1]) x (A[i+2] x ... x A[j])
           ....
           (A[i] x A[i+1] x .. x A[k]) x (A[k+1] x ... x A[j])
           ...
           (A[i] x ... x A[j-1]) x A[j]

           dp[i][i] + dp[i+1,j] + a[i-1]*a[i]*a[j]
           dp[i][i+1]+dp[i+2][j] + a[i-1]*a[i+1]*a[j]
           ...
           dp[i][k] + dp[k+1][j] + a[i-1]*a[k]*a[j]

dp[i,j] = min{dp[i][k] + dp[k+1][j] + a[i-1]*a[k]*a[j],k=i..j-1}
*/

int a[505], n;
long long dp[505][505];

int main()
{
    int i, j, k;
    long long minim;
    fin >> n;
    for(i = 0; i <= n; i++) fin >> a[i];
    for(i = 1; i < n; i++) dp[i][i + 1] = 1LL * a[i - 1] * a[i] * a[i + 1];
    for(i = n - 2; i >= 1; i--)
        for(j = i + 2; j <= n; j++)
        {
            minim = (1LL << 60);
            for(k = i; k < j; k++)
                minim = min(minim, dp[i][k] + dp[k + 1][j] + 1LL * a[i - 1] * a[k] * a[j]);
            dp[i][j] = minim;
        }
    fout << dp[1][n] << '\n';
    return 0;
}