抄了抄代码,看了看区间dp
把这个项链切开,复制一次,枚举右端点,枚举区间长度,确定左端点,区间中选中一个分割点
f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+a[i]*a[k+1]*a[j+1])
#include<iostream> #include<cstdio> using namespace std; int n,ans; int a[210]; int f[210][210]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",a+i);a[i+n]=a[i]; } for(int j=2;j<=2*n-1;j++) for(int i=j-1;i>0&&j-i<n;i--) for(int k=i;k<j;k++) f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+a[i]*a[k+1]*a[j+1]); for(int i=1;i<=n+1;i++) ans=max(ans,f[i][i+n-1]); cout<<ans<<endl; return 0; }
原文:http://www.cnblogs.com/19992147orz/p/6055895.html