Cod sursa(job #780129)

Utilizator crushackPopescu Silviu crushack Data 19 august 2012 22:23:42
Problema Parantezare optima de matrici Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <stdio.h>
#define NMax 510
const char IN[]="podm.in",OUT[]="podm.out";

int N;
int A[NMax][NMax],B[NMax][NMax];
long long T[NMax][NMax];

int main()
{
	int x,i,j,k;
	freopen(IN,"r",stdin);
	scanf("%d",&N);
	for (i=0;i<=N;++i) scanf("%d",A[i]+i);
	fclose(stdin);

	for (i=1;i<=N;++i) B[i][i]=A[i][i];
	for (i=N;i>0;--i) A[i][i]=A[i-1][i-1];

	for (x=1;x<=N;++x)
		for (i=1;i+x<=N;++i)
		{
			j=i+x;
			T[i][j]=T[i][i]+T[i+1][j]+1LL*A[i][i]*B[i][i]*B[i+1][j];A[i][j]=A[i][i];B[i][j]=B[i+1][j];
			for (k=i;k<j;++k) if ( T[i][j]>T[i][k]+T[k+1][j]+1LL*A[i][k]*B[i][k]*B[k+1][j])
				T[i][j]=T[i][k]+T[k+1][j]+1LL*A[i][k]*B[i][k]*B[k+1][j],
				A[i][j]=A[i][k],B[i][j]=B[k+1][j];
		}

	freopen(OUT,"w",stdout);
	printf("%lld\n",T[1][N]);
	fclose(stdout);

	return 0;
}