/*
作者:桦清_L
*/
#include <iostream>
using namespace std;
struct node
{
int l,r;
}a[101];
int dp[101][101];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].l>>a[i].r;
for(int g=2;g<=n;g++)
{
for(int i=1;i<=n-g+1;i++) //开始编号
{
int j=i+g-1; //结束编号
int mini=0x7fffffff;
for(int k=1;k<j;k++) //结束编号的前一位
{
mini=min(mini,dp[i][k]+dp[k+1][j]+a[i].l*a[j].l*a[j].r); //动态转移方程:组成当前点的两部分各自的标量乘法和+到达j的标量乘法
}
dp[i][j]=mini;
}
}
cout<<dp[1][n]<<endl;
return 0;
}
作者:桦清_L
*/
#include <iostream>
using namespace std;
struct node
{
int l,r;
}a[101];
int dp[101][101];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].l>>a[i].r;
for(int g=2;g<=n;g++)
{
for(int i=1;i<=n-g+1;i++) //开始编号
{
int j=i+g-1; //结束编号
int mini=0x7fffffff;
for(int k=1;k<j;k++) //结束编号的前一位
{
mini=min(mini,dp[i][k]+dp[k+1][j]+a[i].l*a[j].l*a[j].r); //动态转移方程:组成当前点的两部分各自的标量乘法和+到达j的标量乘法
}
dp[i][j]=mini;
}
}
cout<<dp[1][n]<<endl;
return 0;
}