Pagini recente » Cod sursa (job #3032247) | Cod sursa (job #2899092) | Cod sursa (job #3214720) | Cod sursa (job #1979895) | Cod sursa (job #369712)
Cod sursa(job #369712)
#include<stdio.h>
#define infile "podm.in"
#define outfile "podm.out"
#define nmax 513
#define inf ~(1<<31)
unsigned 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 unsigned long long min(unsigned long long a, unsigned 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-1<=n;j++) //capatul stang al intervalului
{
k=j+i-1; //capatul drept al intervalului
dp[j][k]=inf; //initializam cu infinit
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("%llu\n",dp[1][n]);
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
read();
init();
solve();
write();
fclose(stdin);
fclose(stdout);
return 0;
}