解题报告:
这题看了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]);
}