Cod sursa(job #2096992)

Utilizator Coroian_DavidCoroian David Coroian_David Data 30 decembrie 2017 11:51:14
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

#define MAX_N 500
#define sqrInf 999999999

using namespace std;

FILE *f, *g;

typedef long long lint;

int n;

lint a[MAX_N + 2];

lint dp[MAX_N + 1][MAX_N + 1];
lint inm[MAX_N + 1][MAX_N + 1];

void readFile()
{
    f = fopen("podm.in", "r");

    fscanf(f, "%d", &n);

    int i;
    for(i = 1; i <= n + 1; i ++)
        fscanf(f, "%lld", &a[i]);

    fclose(f);
}

void getInm()
{
    int i, j;
    for(i = 1; i <= n; i ++)
    {
        int l = a[i];
        int c = a[i + 1];

        for(j = i + 1; j <= n; j ++)
        {
            inm[i][j] = inm[i][j - 1] + l * c * a[j + 1];
            c = a[j + 1];
        }
    }
}

void getDp()
{
    int i, j, h;
    for(i = 2; i <= n; i ++)
    {
        for(j = 1; j + i - 1 <= n; j ++)
        {
            int st = j;
            int dr = j + i - 1;

            dp[st][dr] = inm[st][dr];
            for(h = st; h < dr; h ++)
                dp[st][dr] = min(dp[st][dr], dp[st][h] +
                                             dp[h + 1][dr] +
                                             a[st] * a[h + 1] * a[dr + 1]);
        }
    }
}

void solve()
{
    getInm();

    getDp();
}

void printFile()
{
    g = fopen("podm.out", "w");

    fprintf(g, "%lld\n", dp[1][n]);

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}