解题报告:
这题看了y总的解说是区间dp类型的题目,f[l][r]代表把l到r之间的多边形划分成三角形的最大方案。
其中状态转移就是f[l][r]=min(f[l][r],f[l][k]+f[k][r]+w[l]*w[r]*w[k])(k<r&&k>l),然后再套一点大数模板就行啦。。

#include<iostream>
#include<cstring>
using namespace std;
const   int N=55 ,M=35;
typedef long long ll;                              
ll a[M],b[M] ,w[N];
ll f[N][N][M];
void mul(ll a[],ll b)
{
   
    ll res[M];
    memset(res,0 ,sizeof res);
    for(ll i=0,t = 0;i<M;i++)
    {
   
        t += a[i]*b;
        res[i] = t%10;
        t/=10;
    }
    memcpy (a, res, sizeof res);
}
void add (ll a[] , ll b[])
{
   
    ll res[M];
    memset(res, 0 ,sizeof res);
    for(int i=0,t=0;i<M;i++)
    {
   
        t+=a[i]+b[i];
        res[i]= t % 10;
        t/=10;
    }
    memcpy (a , res, sizeof res);
}
void print(ll a[])
{
   
    int k =M-1;
    while(!a[k]) k--;
    for(int i=k ; i>=0;i--)
    printf("%lld",a[i]);
    printf("\n");
}
int cmp(ll a[], ll b[])
{
   
    for(int i=M-1;i>=0;i--)
    {
   
        if(a[i]>b[i])
        return 1;
        else if(a[i]<b[i])
        return -1;
    }
    return 0;
}
int main()
{
   
    int n;
    ll temp[M];
    cin >> n;
    for(int i=1;i<=n;i++)
    cin>>w[i];
    for(int len=3; len <=n;len++)
    for(int l=1;len+ l -1<= n ; l++)
    {
   
        int r = l + len -1;
        f[l][r][M-1]=1;
        for(int k=l+1 ;k <r;k++)
        {
   
            memset(temp,0, sizeof temp);
            temp[0]=w[l];
            mul(temp,w[r]);
            mul(temp,w[k]);
            add(temp,f[l][k]);
            add(temp,f[k][r]);
            if(cmp(temp , f[l][r]) < 0)
            {
   
                memcpy(f[l][r],temp,sizeof temp);
            }
        }
    }
    print(f[1][n]);
}