Cod sursa(job #1343447)

Utilizator alexge50alexX AleX alexge50 Data 15 februarie 2015 14:54:04
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include <stdio.h>
#include <limits.h>

#define lld unsigned long long int
#define min(a,b) (a<b?a:b)
#define INF (LONG_LONG_MAX)

#define MAX_N 500

lld D[MAX_N+1][MAX_N+1],dim[MAX_N+1];

void rec_print(int i,int j,FILE *f)//recursive printer
{
    //printf("%lld\n",D[j][i]);
    if(i==j)
    {
        fprintf(f,"%d",i);
    }
    else
    {
        fprintf(f,"(");
        rec_print(i,D[j][i],f);
        fprintf(f,"*");
        rec_print(D[j][i]+1,j,f);
        fprintf(f,")");
    }

}

int main()
{
    FILE *fin=fopen("podm.in","r"),
         *fout=fopen("podm.out","w");
    int n;
    int i,j,diag,k;
    lld nrop;

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

    for(i=0;i<n+1;i++)
    {
        fscanf(fin,"%llu",&dim[i]);
    }


    //diagonala 1-> 0
    for(i=1;i<=n;i++)
        D[i][i]=0;
    //diagonala 2-> cate operatii e nevoie pt a inmultii matricea i cu i+1
//    for(i=1;i<=n-1;i++)
//        D[i][i+1]=dim[i-1]*dim[i]*dim[i+1];
    //diagonala ramase-> calculeaza unde trbuie pusa o spartura optim
    for(diag=1;diag<=n-1;diag++)
    {
        for(i=1;i<=n-diag;i++)
        {
            j=i+diag;
            D[i][j]=INF;
            for(k=i;k<=j-1;k++)
            {
//                D[i][j]=min(
//                            D[i][j],
//                            D[i][k]+D[k+1][j]+dim[i-1]*dim[k]*dim[j]
//                            );

                   nrop=D[i][k]+D[k+1][j]+dim[i-1]*dim[k]*dim[j];
                    if(D[i][j]>nrop)
                    {
                        D[i][j]=nrop;
                        D[j][i]=k;
                    }


//                if(D[i][j]<D[i][k]+D[k+1][j]+dim[i-1]*dim[k]*dim[j])
//                    printf("D[%d][%d]-ramane acelas(%d)\n",i,j,k);
//                else
//                    printf("D[%d][%d]: %lld = %lld+%lld+%lld*%lld*%lld (%d)\n",i,j,D[i][k]+D[k+1][j]+dim[i-1]*dim[k]*dim[j],
//                                                                        D[i][k],D[k+1][j],dim[i-1],dim[k],dim[j],k),D[j][i]=k;

            }
        }
    }

//    for(i=1;i<=n;i++){
//    for(j=1;j<=n;j++)
//        printf("%04lld ",D[i][j]);
//        printf("\n");
//        }

    fprintf(fout,"%llu\n",D[1][n]);
    //rec_print(1,n,fout);

    fclose(fin);
    fclose(fout);
    return 0;
}