Cod sursa(job #613410)

Utilizator Sm3USmeu Rares Sm3U Data 24 septembrie 2011 11:53:11
Problema Parantezare optima de matrici Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <stdio.h>
#define min(a,b) (a<b)?a:b

using namespace std;

int n;
int d[510];
int m[510][510];

void citire()
{
    scanf("%d",&n);
    for(int i=0;i<=n;i++)
        scanf("%d",&d[i]);
}

int val(int i, int j)
{
    int minim=99999999;
    for(int k=i;k<j;k++)
    {
        if(minim>m[i][k]+m[k+1][j]+d[i-1]*d[k]*d[j])
            minim=m[i][k]+m[k+1][j]+d[i-1]*d[k]*d[j],m[j][i]=k;
    }
    return minim;
}

void matrice()
{
    for(int J=2;J<=n;J++)
    {
        for(int i=1,j=J;j<=n;j++,i++)
        {
            m[i][j]=val(i,j);
        }
    }
}

void afisare(int i,int j)
{
    if(i-j==1)
    {
        printf("A%d*A%d",j,i );
        return;
    }
    if(j-i==1)
    {
        printf("A%d*A%d",i,j );
        return;
    }
    if(i==j)
    {
        printf("A%d",j);
        return;
    }
    printf("(");
    afisare(m[i][j],j);
    printf(")*(");
    afisare(m[i][j]+1,i);
    printf(")");


}


int main()
{
    freopen("fis.in","r",stdin);

    citire();
    matrice();
    printf("%d\n",m[1][n]);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            printf("%6d ",m[i][j]);
        }
        printf("\n");
    }

    afisare(n,1);

    return 0;
}