解题说明:
AC代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=35; ll dp[MAXN][MAXN]; int root[MAXN][MAXN],s[MAXN],n,flag=0; void prin(int a[MAXN][MAXN],int x,int y){ if(flag==0){ printf("%d",a[x][y]); flag=1; } else printf(" %d",a[x][y]); if(x<a[x][y])prin(root,x,a[x][y]-1); if(a[x][y]<y)prin(root,a[x][y]+1,y); } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&s[i]); } memset(dp,0,sizeof(dp)); for(int l=1;l<=n;l++){ for(int i=1,j;i<=n-l+1;i++){ j=i+l-1; if(i==j){ dp[i][j]=s[i]; root[i][j]=i; continue; } for(int k=i;k<=j;k++){ if(dp[i][j]<(k-1<i?1:dp[i][k-1])*(k+1>j?1:dp[k+1][j])+s[k]){ dp[i][j]=(k-1<i?1:dp[i][k-1])*(k+1>j?1:dp[k+1][j])+s[k]; root[i][j]=k; } } } } printf("%d\n",dp[1][n]); prin(root,1,n); printf("\n"); return 0; }