Pagini recente » Cod sursa (job #1352) | Cod sursa (job #3204795) | Cod sursa (job #1282273) | Cod sursa (job #2587629) | Cod sursa (job #1870612)
#include <stdio.h>
#define maxn 505
long long inf = 1LL<<60;
int n,i,j,l,k;
long long d[maxn],inm[maxn][maxn],aux; //inm[i][j] este costul inmultirii matricelor A(i)*A(i+1)*...*A(j)
//A(i) are dimensiunea d[i-1]*d[i]
void afis()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",inm[i][j]);
printf("\n");
}
printf("\n");
}
int main()
{
FILE *f1,*f2;
f1=fopen("podm.in","r");
f2=fopen("podm.out","w");
fscanf(f1,"%d",&n);
for(i=0;i<=n;i++)
fscanf(f1,"%d",&d[i]);
for(i=1;i<n;i++) //calculez costul inmultirii mat A(i) cu A(i+1) => l=1
inm[i][i+1]=d[i-1]*d[i]*d[i+1];
for(l=2;l<n;l++) //l este lungimea unei expresii
for(i=1;i<=n-l;i++)
{
inm[i][i+l]=inf;
for(j=0;j<l;j++) //calculam costurile posibile si il alegem pe cel mai bun
{
k=j+i;
aux=inm[i][k] + inm[k+1][i+l] + d[i-1]*d[k]*d[i+l];
if(aux<inm[i][i+l])
inm[i][i+l]=aux;
}
}
fprintf(f2,"%lld",inm[1][n]);
//afis();
return 0;
}