#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 55,M = 40;
LL f[N][N][M];
int n;
LL w[N];
void add(LL a[],LL b[])
{
int t=0;
static LL c[M];
memset(c,0,sizeof c);
for(int i=0;i<M;i++)
{
t+=a[i]+b[i];
c[i]=t%10;
t=t/10;
}
memcpy(a,c,sizeof c);
}
void mul(LL a[],LL b)
{
static LL c[M];
//这边t要为LL
LL t=0;
memset(c,0,sizeof c);
for(int i=0;i<M;i++)
{
t+=a[i]*b;
c[i]=t%10;
t=t/10;
}
memcpy(a,c,sizeof c);
}
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;
}
void print(LL a[])
{
int k=M-1;
while(k&&!a[k])k--;
for(int i=k;i>=0;i--)
printf("%lld",a[i]);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%lld",&w[i]);
LL temp[M];
for(int len=3;len<=n;len++)
{
for(int i=1;i+len-1<=n;i++)
{
int j=i+len-1;
f[i][j][M-1]=1;
for(int k=i+1;k<=j-1;k++)
{
//f[i][j]=min(f[i][j],f[i][k]+f[k][j]+w[i]*w[j]*w[k]);
memset(temp,0,sizeof temp);
temp[0]=w[i];
mul(temp,w[k]);
mul(temp,w[j]);
add(temp,f[i][k]);
add(temp,f[k][j]);
if(cmp(temp,f[i][j])<0)
memcpy(f[i][j],temp,sizeof temp);
}
}
}
print(f[1][n]);
return 0;
}
AcWing 1069. 凸多边形的划分
最新推荐文章于 2024-07-12 10:45:15 发布