Pagini recente » Cod sursa (job #418219) | Cod sursa (job #2701115) | Cod sursa (job #1201621) | Istoria paginii runda/o__o | Cod sursa (job #1095715)
#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] * Dim[i] * Dim[i+1];
for(int dif=2; dif + 1 <= 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] * Dim[k] * Dim[j]);
}
}
void Print()
{
freopen("podm.out","w",stdout);
printf("%lld\n",DP[1][N]);
}
int main()
{
Read();
Solve();
Print();
return 0;
}