Cod sursa(job #536150)

Utilizator SheepBOYFelix Liviu SheepBOY Data 18 februarie 2011 12:28:50
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
/*#include<stdio.h>
const int MAXDIM=510;
const long long INF=200000000000000000LL;
int n,dv[MAXDIM];
long long dinique[MAXDIM][MAXDIM];
int main()
{
	long long min;
	int i,j,d;
	freopen("podm.in","r",stdin);
	freopen("podm.out","w",stdout);
	scanf("%d",&n);
	for( i = 0 ; i <= n ; ++i )
	{
		scanf("%d",dv+i);
		dinique[i][i]=0;
	}
	
	for( i = 1 ; i < n ; ++ i)
		dinique[ i ][ i + 1 ] = dv[i-1]*dv[i]*dv[i+1] ;
	
	for( d = 2 ; d < n ; ++ d )
		for( i = 1 ; i <= n-d ; ++ i )
		{
			min=INF;
			for( j = i ; j < i + d; ++ j ) 
				if( min > dinique [ i ] [ j ] + dinique [ j + 1 ] [ i + d ] + dv[ i-1 ] * dv[ j ] * dv[ i + d ] )
					min= dinique [ i ] [ j ] + dinique [ j + 1 ] [ i + d ] + dv[ i-1 ] * dv[ j ] * dv[ i + d ];
			
			if(dinique[i][i+d] > min || !dinique[i][i+d])
				dinique[i][i+d]=min;
		}
		
	printf("%lld",dinique[1][n]);
	return 0;
}*/	
#include<stdio.h>
#include<fstream>
#define INF 200000000000000000LL
using namespace std;
int n,k;
long long mat[5001][5001];
long v[5001];
long long fct(long long a,long long b)
{
if(a<b)
return a;
return b;
}
void citire()
{
//freopen("podm.in","r",stdin);
ifstream in("podm.in");
freopen("podm.out","w",stdout);
	in>>n;
for(int i=0;i<=n;i++)
in>>v[i];

}
void construction()
{
for (int i=1;i<n;i++)
mat[i][i+1]=v[i-1]*v[i]*v[i+1];
	for(int i=2;i<=n-i;i++)
for(int j=1;j<=n-1;j++)
{
k=i+j;
mat[j][k]=INF;
for(int l=j;l<=k-1;l++)
mat[j][k] = fct(mat[j][k],mat[j][l] + mat[l+1][k] + v[j-1]*v[l]*v[k]);	
}	
}


int main()
{
citire();
construction();
printf("%lld",mat[1][n]);
return 0;
}