Cod sursa(job #2684569)

Utilizator tomaionutIDorando tomaionut Data 14 decembrie 2020 09:00:41
Problema Parantezare optima de matrici Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include<bits/stdc++.h>
using namespace std;

/**
4
13 5 89 3 34

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

dp[i,j] = costul minim al inmultirii Ai * A[i+1] *... *Aj
Sol dp[1][n]

Initial:
dp[i][i+1] = a[i-1]*a[i]*a[i+1], i=1..n-1

Recurente:
dp[i][j] = min(dp[i][i] + a[i-1]*a[i]*a[j]
               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][j-1]+a[i-1]*a[j-1]*a[j]
               )
dp[i][j] = min(dp[i][k]+dp[k+1][j]+a[i-1]*a[k]*a[j], k=i..j-1),
*/

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

int main()
{
    int i, j, k, d;
    long long x;
    cin >> n;
    for (i = 0; i <= n; i++)
        cin >> a[i];
    /// init:
    for (i = 1; i <= n; i++)
        dp[i][i+1] = a[i-1]*a[i]*a[i+1];
    /// recurente
    for (d = 1; d < n; d++)
        for (i = 1; i <= n - d; i++)
        {
            j = i + d;
            x = (1LL << 60);
            for (k = i; k < j; k++)
                x = min(x, dp[i][k] + dp[k+1][j] + a[i-1]*a[k]*a[j]);
            dp[i][j] = x;
        }
    cout << dp[1][n];
	return 0;
}