Cod sursa(job #2014165)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 23 august 2017 00:28:34
Problema Parantezare optima de matrici Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#define VAL 505
#define INF 1000000000000000000

using namespace std;

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

int N, i, j, k;
int v[VAL], l;
long long dp[VAL][VAL], mn;

void Check1(int a, int b, int c, int d)
{
    long long X=dp[c][d], Y, Z;
    Y=1LL*v[a]*v[b]*v[c]+1LL*v[a]*v[c]*v[d];
    Z=1LL*v[b]*v[c]*v[d]+1LL*v[a]*v[b]*v[c];
    X+=min(Y, Z);
    mn=min(mn, X);
}

void Check2(int a, int b, int c, int d)
{
    long long X=dp[a][b], Y, Z;
    Y=1LL*v[a]*v[b]*v[c]+1LL*v[a]*v[c]*v[d];
    Z=1LL*v[b]*v[c]*v[d]+1LL*v[a]*v[b]*v[c];
    X+=min(Y, Z);
    mn=min(mn, X);
}

void Check3(int a, int b, int c, int d)
{
    long long X=dp[a][b]+dp[c][d], Y, Z;
    Y=1LL*v[a]*v[b]*v[c]+1LL*v[a]*v[c]*v[d];
    Z=1LL*v[b]*v[c]*v[d]+1LL*v[a]*v[b]*v[c];
    X+=min(Y, Z);
    mn=min(mn, X);
}

int main()
{
    fin >> N;
    N++;
    for (i=1; i<=N; i++)
      fin >> v[i];
    for (l=3; l<=N; l++)
    {
        for (i=1; i<=N-l+1; i++)
        {
            j=i+l-1;
            mn=INF;
            for (k=i+2; k<=j-3; k++)
              Check3(i, k, k+1, j);
            if (l==3)
              mn=1LL*v[i]*v[i+1]*v[i+2];
            if (l>=4)
            {
                mn=min(mn, 1LL*v[i]*v[i+1]*v[j]+dp[i+1][j]);
                mn=min(mn, 1LL*v[i]*v[j-1]*v[j]+dp[i][j-1]);
            }
            if (l>=5)
            {
                Check1(i, i+1, i+2, j);
                Check2(i, j-2, j-1, j);
            }
            dp[i][j]=mn;
        }
    }
    fout << dp[1][N] << '\n';
    fin.close();
    fout.close();
    return 0;
}