Code:
1 #include <bits/stdc++.h> 2 # define LL long long 3 using namespace std; 4 5 const int maxn=100+10; 6 int N; 7 int val[maxn]; 8 int dp[maxn][maxn]; 9 10 int pre(int i){ 11 return i==1?N:i-1; 12 } 13 14 int next(int i){ 15 return i==N?1:i+1; 16 } 17 18 int dfs(int left, int right){ 19 if(dp[left][right]!=-1) return dp[left][right]; 20 21 int res=0; 22 for(int i=left;i!=right;i=next(i)){ 23 int tmp=val[left]*val[next(i)]*val[next(right)]+dfs(left,i)+dfs(next(i),right); 24 res=max(res,tmp); 25 } 26 return dp[left][right]=res; 27 } 28 29 int main(){ 30 memset(dp,-1,sizeof(dp)); 31 scanf("%d", &N); 32 for(int i=1;i<=N;++i){ 33 scanf("%d", val+i); 34 } 35 int res=0; 36 for(int i=1;i<=N;++i){ 37 res=max(res,dfs(i,pre(i))); 38 } 39 printf("%d", res); 40 }
bottom-up:
int e[250]; int dp[250][250]; int main(){ int N; cin>>N; for(int i=1;i<=N;i++){ scanf("%d", e+i); e[i+N]=e[i]; } int res=0; for(int len=2;len<=N;len++){ for(int i=1;len+i-1<2*N;i++){ int j=len+i-1; for(int k=i;k<j;k++){ dp[i][j]=max(dp[i][j], e[i]*e[k+1]*e[j+1]+dp[i][k]+dp[k+1][j]); } } } for(int i=1;i<=N;i++){ res=max(res,dp[i][i+N-1]); } printf("%d", res); return 0; }