动态规划的想法很容易想到,但是在细节上特别是整除那里容易出错,如果下标从0开始也许更为方便一些。
#include <stdio.h>
#include <string.h>
int const maxn = 210;
int a[maxn],s[maxn][maxn];
int n;
int f(int k) {
if(k>n) {
if(k%n==0) return n;
else return k%n;
} else return k;
}
int main() {
while(scanf("%d",&n)!=EOF) {
for (int i=1;i<=n;i++) {
scanf("%d",&a[i]);
}
memset(s,0,sizeof(s));
int ans = 0;
for (int len=2;len<=n;len++)
for (int i=1;i<=n;i++) {
for (int k=1;k<=len-1;k++) {
int tmp = s[i][k]+s[f(i+k)][len-k]+a[i]*a[f(i+k)]*a[f(i+len)];
if(tmp>s[i][len]) {
s[i][len] = tmp;
if(len==n&&ans<tmp) ans=tmp;
}
}
}
printf("%d\n",ans);
}
}