Pagini recente » Cod sursa (job #359926) | Cod sursa (job #2199473) | Cod sursa (job #476271) | Cod sursa (job #2218225) | Cod sursa (job #948338)
Cod sursa(job #948338)
#include <fstream>
#define In "podm.in"
#define Out "podm.out"
#define Nmax 502
#define Inf 9223372036854775807LL
#define min(a,b) (((a)<=(b))?(a):(b))
using namespace std;
int n;
long long best[Nmax][Nmax],D[Nmax];
//best[i][j] = solutia optima din intervalul i,i+1,...,j;
//matricea i are dimensiunile (Di-1],D[i])
//numarul de inmultiri efectuate pentru a inmulti doua matrice cu
//dimensiunile (x,y) respectiv (y,z) este x*y*z
inline void Citire()
{
ifstream f(In);
f>>n;
int i;
for(i=0;i<=n;i++)
f>>D[i];
}
inline void Dinamic()
{
int k,i,j,d;
for(i=1;i<=n;i++)
best[i][i]=0;
for(i=1;i<n;i++)
best[i][i+1] = D[i-1] * D[i] * D[i+1];
for(d=2;d<=n;d++)
for(i = 1, j = d;j<=n;i++,j++)
{
if(best[i][j]==0)
best[i][j] = Inf;
for(k=i;k<j;k++)
best[i][j] = min(best[i][j],best[i][k]+best[k+1][j]+D[i-1]*D[k]*D[j]);
}
}
inline void Afisare()
{
ofstream g(Out);
g<<best[1][n]<<"\n";
g.close();
}
int main()
{
Citire();
Dinamic();
Afisare();
return 0;
}