区间dp
f[l][r] 拿走l r之间的所有卡后的最小值
转移方程为f[l][r]=min(f[l][i]+f[i][r]+ai*al*ar) 1=<i<=r
记忆化搜索就好
#include<bits/stdc++.h>
using namespace std;
int n;
int a[120];
int f[120][120];
int dp(int l,int r)
{
if (f[l][r]!=-1)
return f[l][r];
if (r-l<=1)
{
f[l][r]=0;
return f[l][r];
}
f[l][r]=1200000000;
for (int i=l;i<=r;i++)
f[l][r]=min(f[l][r],dp(l,i)+dp(i,r)+a[l]*a[r]*a[i]);
return f[l][r];
}
void Gao()
{
for (int i=1;i<=n;i++)
scanf("%d",a+i);
memset(f,-1,sizeof(f));
cout<<dp(1,n)<<endl;
}
int main()
{
while (cin>>n)
Gao();
return 0;
}