Pagini recente » Cod sursa (job #1282717) | Cod sursa (job #2237731) | Cod sursa (job #486553) | Cod sursa (job #1432933) | Cod sursa (job #1095719)
#include <cstdio>
using namespace std;
#define minim(a,b) ((a<b)?(a):(b))
#define NMAX 505
#define oo (1<<30)
int N;
int Dim[NMAX];
long long DP[NMAX][NMAX];
void Read()
{
freopen("podm.in","r",stdin);
scanf("%d",&N);
for(int i=0;i<=N;i++)
scanf("%d",&Dim[i]);
}
void Solve()
{
//DP[i][j] = numarul minim de calcule ce sunt necesare pentru a inmulti matricile de la i la j
for(int i=1;i<=N;i++)
DP[i][i+1] = Dim[i-1] * 1LL * Dim[i] * Dim[i+1];
for(int dif=2; dif < N; dif++)
for(int i=1; i+dif <=N; i++)
{
int j = i+dif;
DP[i][j] = oo;
for(int k=i;k<j;k++)
DP[i][j] = minim(DP[i][j], DP[i][k] + DP[k+1][j] + Dim[i-1] * 1LL * Dim[k] * Dim[j]);
}
}
void Print()
{
freopen("podm.out","w",stdout);
printf("%lld\n",DP[1][N]);
}
int main()
{
Read();
Solve();
Print();
return 0;
}