环状DP,可以记忆化,亦可以递推。
/*
* tyvj-1056
* mike-w
* 2011-11-8
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max(a,b) ((a)>(b)?(a):(b))
#define SIZE 500
int f[SIZE];
int opt[SIZE][SIZE];
int N;
int main(void)
{
int i,j,k,ans;
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
/* read and preprocessing */
scanf("%d",&N);
for(i=1;i<=N;i++)
scanf("%d",f+i);
for(i=1;i<=N+10;i++)
f[i+N]=f[i];
/* dp */
for(k=2;k<=N;k++)
for(i=1;i+k-1<=2*N;i++) /* 注意i的遍历范围,我因这一点WA一次 */
for(j=i+1;j<=i+k-1;j++)
opt[i][i+k-1]=max(opt[i][i+k-1],
opt[i][j-1]+opt[j][i+k-1]+f[i]*f[i+k]*f[j]);
/* output */
ans=0;
for(i=1;i<=N;i++)
if(ans<opt[i][i+N-1])
ans=opt[i][i+N-1];
printf("%d\n",ans);
return 0;
}