Cod sursa(job #3299958)

Utilizator Carnu_EmilianCarnu Emilian Carnu_Emilian Data 12 iunie 2025 08:42:43
Problema Parantezare optima de matrici Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>

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

/**
dp[i,j] = numarul minim de operatii necesar pentru a
          inmulti Ai * A[i+1] * .. Aj

          A1 x A2 x ... B[i..j] x A[j+1] x ... x An
Sol dp[1][n]

Date initiale: dp[i][i] = 0
               dp[i][i+1] = v[i-1]*v[i]*v[i+1], i=1..n-1

Recurente:

A[i] A[i+1] A[i+2] ... A[k] ... A[j-1] A[j]

dp[i][j] = min{
           dp[i][i] + dp[i+1][j] + v[i-1]*v[i]*v[j]
           dp[i,i+1] + dp[i+2][j] + v[i-1]*v[i+1]*v[j]
           dp[i,i+2] + dp[i+3][j] + v[i-1]*v[i+2]*v[j]
           ....
           dp[i,j-1] + dp[j][j] + v[i-1]*v[j-1]*v[j]
            }

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

long long dp[502][502], v[502];
int n;

int main()
{
    int i, j, d, k;
    long long minn;
    fin >> n;
    for (i = 0; i <= n; i++)
        fin >> v[i];
    /// init.
    for(i = 1; i < n; i++)
        dp[i][i+1] = v[i-1]*v[i]*v[i+1];
    /// recurente
    for (d = 2; d < n; d++)
        for (i = 1; i <= n - d; i++)
        {
            j = i + d;
            minn = (1LL << 60);
            for (k = i + 1; k <= j; k++)
                minn = min(minn, dp[i][k-1] + dp[k][j] + v[i-1]*v[k-1]*v[j]);
            dp[i][j] = minn;
        }
    fout << dp[1][n] << "\n";
    return 0;
}