因为这是一种中链式dp,为了方便起见,将环状的项链平坦开呈链状,并且多加一次,这样可以找到所有情况
设f[i][j]为从i到j所能获得的最大值,因此从l枚举到r,求出最大值
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i+n]=a[i];//在末尾多加一段
for(int i=2;i<n*2;i++){//枚举末尾
for(int j=1;j+i-1<2*n;j++){//枚举起点
int r=j+i-1;
for(int k=j;k<r;k++)//每个点都合并试试
f[j][r]=max(f[j][r],f[j][k]+f[k+1][r]+a[j]*a[k+1]*a[r+1]);
}
}
for(int i=1;i<=n;i++)ans=max(ans,f[i][i+n-1]);//跑一遍求出最大值
printf("%d",ans);
return 0;