中序遍历是1,2,3,…,n,所以转化为一个区间dp喽。
考察了关于中序遍历的认识。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=35;
int n;
int a[N],f[N][N],g[N][N];
void dfs(int l,int r)
{
if (l>r) return;
printf("%lld ",g[l][r]);
dfs(l,g[l][r]-1);
dfs(g[l][r]+1,r);
}
signed main(){
scanf("%lld",&n);
for (register int i=1; i<=n; ++i) scanf("%lld",&a[i]),f[i][i]=a[i],g[i][i]=i;
for (register int l=2; l<=n; ++l)
for (register int i=1; i+l-1<=n; ++i)
{
int j=i+l-1;
f[i][j]=a[i]+f[i+1][j]; g[i][j]=i;
if (a[j]+f[i][j-1]>f[i][j]) f[i][j]=a[j]+f[i][j-1],g[i][j]=j;
for (register int k=i+1; k<j; ++k)
{
if (a[k]+f[i][k-1]*f[k+1][j]>f[i][j]) f[i][j]=a[k]+f[i][k-1]*f[k+1][j],g[i][j]=k;
}
}
printf("%lld\n",f[1][n]);
dfs(1,n);
return 0;
}