题意:类似于lrj白书中的矩阵链成,但唯一不同的是现在他是一个环,顺时针,而之前的是链,所以用循环dp,思路就是重新的给d【i】【j】(i>j)也赋予值,从i到j的最大值,之前就不存在这种情况(*****重点)。
d[i][j]=max(d[i][j],d[i][k]+d[(k+1)%n][j]+a[i]*a[(k+1)%n]*a[(j+1)%n]);。
#include<stdio.h>
#include<string.h>
#define max(a,b) a>b?a:b
int a[1010];
int d[1010][1010];
int main()
{
int i,j,k,m,n,p,t,cn,cnt;
while(scanf("%d",&n)!=EOF)
{
memset(d,0,sizeof(d));
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
d[i][(i+1)%n]=a[i]*a[(i+1)%n]*a[(i+2)%n];
}
//for(t=0;t<n;t++)
t=0;
for(p=2;p<n;p++) //间隔
{
for(cn=0,i=t;cn<n;i++,cn++)
{
i%=n;
j=(i+p)%n;
//if(j>n)
//break;
for(cnt=0,k=i;;k++,cnt++) //注意这儿只要到j就可停止,不可执行n-1次,我之前错过这
//for(k=i;k<j;k++)
{
k%=n;
if(k==j)
break;
d[i][j]=max(d[i][j],d[i][k]+d[(k+1)%n][j]+a[i]*a[(k+1)%n]*a[(j+1)%n]);
}
}
}
//printf("%d %d\n",d[0][2],d[0][3]);
t=0;
for(i=0;i<n;i++)
{
t=max(d[i][(i+n-1)%n],t);
}
printf("%d\n",t);
}
}