Cod sursa(job #478520)

Utilizator a.stanciuStanciu Adrian a.stanciu Data 18 august 2010 23:09:30
Problema Parantezare optima de matrici Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#include <stdlib.h>

long long parantezare(int *d, int n)
{
    int i, j, k, l, q;
    long long **m = (long long **)malloc(sizeof(long long *) * (n + 1));
    for (i = 0; i <= n; i++)
        m[i] = (long long *)calloc(n + 1, sizeof(long long));
    
    for (l = 2; l <= n; l++)
        for (i = 1; i <= n - l + 1; i++)
        {
            j = i + l - 1;
            m[i][j] = -1;
            for (k = i; k < j; k++)
            {
                q = m[i][k] + m[k + 1][j] + d[i - 1] * d[k] * d[j];
           	    if ((q < m[i][j] || m[i][j] == -1) && m[i][k] != -1 && m[k + 1][j] != -1) m[i][j] = q;
            }
        }
    return m[1][n];
}

int main()
{
    int n, *d, i;
    long long r;
    FILE *f, *g;
    
    f = fopen("podm.in", "r");
    g = fopen("podm.out", "w");
    
    fscanf(f, "%d", &n);
    d = (int *)malloc(sizeof(int) * (n + 1));
    for (i = 0; i <= n; i++)
        fscanf(f, "%d", &d[i]);
        
    r = parantezare(d, n);
    
    fprintf(g, "%lld\n", r);
    
    fclose(f);
    fclose(g);
    
    return 0;
}