Cod sursa(job #369718)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 29 noiembrie 2009 13:10:23
Problema Parantezare optima de matrici Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.05 kb
#include<stdio.h>
#define infile "podm.in"
#define outfile "podm.out"
#define nmax 513
long long dp[nmax][nmax]; //dp[i][j]=costul minim de a inmulti scalar intervalul [i,j]
int d[nmax]; //dimensiunile matricilor
int n; //numarul dematrici

inline long long min(long long a, long long b)
{
	if(a<b) return a; return b;
}

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

void init()
{
	int i;
	for(i=1;i<n;i++)
		dp[i][i+1]=d[i-1]*d[i]*d[i+1];
}

void solve()
{
	int i,j,k,l;
	for(i=2;i<=n;i++) //marimea intervalului
		for(j=1;j+i<=n;j++) //capatul stang al intervalului
		{
			k=j+i; //capatul drept al intervalului
			dp[j][k]=(long long)999999999999999; //initializam cu infinit
			printf("%lld\n",dp[j][k]);
			for(l=j;l<=k;l++) //selectam pozitia taierii
				dp[j][k]=min(dp[j][k],dp[j][l]+dp[l+1][k] + d[j-1]*d[l]*d[k]);
		}
}

void write()
{
	printf("%lld\n",dp[1][n]);
}

int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	read();
	init();
	solve();
	write();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}