题目地址:http://zsyz.openjudge.cn/dp/23/
/*
Author:Bob Lee
2012.9.20
=================================================
这是一道中文的题目,题意我就不用解释了
这是一道区间DP
我们用f[i][j]表示由i到j的最大能量值
那么它的子问题就是将i到j分成两段
然后相乘的最大值
则可以导出状态转移方程
f[i][j]= max(f[i][k]+f[k+1][j]+data[i]*data[k+1]*data[j+1])
(1<=i<=k<j<=2n-1)
其中data[i]表示第i个的头,i+1才是尾
还有一个问题,那就是这个项链是一个环
所以头不一定是1
那么我们就在1~n再加一个
这样我们只需要枚举f[i][n+i-1] (1<=i<=n)
求得其最大值
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define MAXN 105
#define INF 1<<30
int f[2*MAXN][2*MAXN];
int data[2*MAXN];
int n;
void update(int &x,int y)
{
if(y>x)
x=y;
}
int main()
{
//while(scanf("%d",&n) != EOF)
scanf("%d",&n);
{
int i,j;
for(i=1;i<=n;i++)
{
scanf("%d",&data[i]);
data[i+n] = data[i];
}
for(i=1;i<=2*n;i++)
{
for(j=1;j<=2*n;j++)
{
if(i==j)
f[i][j] = 0;
else
f[i][j] = 0;
}
}
int len;
for(len=1;len<n;len++)
{
for(i=1;i<=2*n-len;i++)
{
j=i+len;
int k;
for(k=i;k<j;k++)
{
update(f[i][j],f[i][k]+f[k+1][j]+data[i]*data[k+1]*data[j+1]);
}
}
}
int ans = -INF;
for(i=1;i<=n;i++)
{
update(ans,f[i][n+i-1]);
//cout<<f[i][n+i-1]<<endl;
}
printf("%d\n",ans);
}
return 0;
}