Cod sursa(job #518410)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 31 decembrie 2010 15:44:03
Problema Parantezare optima de matrici Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<stdio.h>
long a[501][501][2],m1,m2,t1,t2,v1,v2;
int dim[501],i,n,j,d,k,v[501][501][501];

int main()
{freopen("podm.in","r",stdin);
freopen("podm.out","w",stdout);
scanf("%d\n",&n);
for(i=0;i<=n;i++)
       scanf("%d ",&dim[i]);
for(i=1;i<=n;i++)
       {a[i][i][0]=0;
       a[i][i][1]=0;}
for(i=1;i<=n-1;i++)
       {t1=(dim[i-1]*dim[i])/1000;
       t2=(dim[i-1]*dim[i])%1000;
       a[i][i+1][0]=(t1*dim[i+1])/1000;
       a[i][i+1][1]=(((t1*dim[i+1])%1000)+(t2*dim[i+1])/1000)*1000+(t2*dim[i+1])%1000;}
for(d=2;d<n;d++)
       {for(i=1;i<=n-d;i++)
               {a[i][i+d][0]=400000000;
               a[i][i+d][1]=0;
               for(k=i;k<i+d;k++)
                        {t1=(dim[i-1]*dim[k])/1000;
                        t2=(dim[i-1]*dim[k])%1000;
                        v1=(t1*dim[i+d])/1000;
                        v2=(((t2*dim[i+d])/1000)+((t1*dim[i+d])%1000))*1000+(t2*dim[i+d])%1000;
                        m1=a[i][k][0]+a[k+1][i+d][0]+v1;
                        m2=a[i][k][1]+a[k+1][i+d][1]+v2;
                        if(a[i][i+d][0]>m1)
                                 {a[i][i+d][0]=m1;
                                 a[i][i+d][1]=m2;}}}}

if(a[1][n][0]==0)
       printf("%ld",a[1][n][1]);
else
       printf("%ld%ld",a[1][n][0]+a[1][n][1]/1000000,a[1][n][1]%1000000);
fclose(stdin);
fclose(stdout);
return 0;}