解题说明:
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;
}