【题意】题目链接 www.wikioi.com/problem/1154/
【分析】这题是可以循环的区间dp,只要把数组复制一个连接在后面,然后因为可以从任何一点开始,所以需要求dp[][]中的最大值
【AC代码】 5ms
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 220
int main ()
{
int n;
scanf ("%d%*c", &n);
int dp[MAXN][MAXN] = {0}, a[MAXN] = {0}, ans = -1;
for (int i = 1; i <= n; i++)
{
scanf ("%d%*c", &a[i]);
a[i+n] = a[i];
}
n <<= 1;
for (int len = 1; len < (n>>1); len++)//i~j长度还是原来的n,其他还是正常的区间dp
{
for (int i = 1; i <= n-len; i++)
{
int j = len+i;
dp[i][j] = dp[i][i]+dp[i+1][j]+a[i-1]*a[i]*a[j];
for (int k = i+1; k < j; k++)
dp[i][j] = max(dp[i][j], dp[i][k]+dp[k+1][j]+a[i-1]*a[k]*a[j]);
if (ans < dp[i][j])
ans = dp[i][j];
}
}
printf ("%d\n", ans);
return 0;
}