用的区间dp,每次初始化区间最大积分的时候只考虑了根为左端点(也就是右子树为空)的情况,右端点为根没有考虑,循环里也不会考虑这种情况,为啥还AC了。。。
#include<bits/stdc++.h>
using namespace std;
long long a[35],dp[35][35],n,root[35][35];
void print(int l,int r){
if(l>r) return;
cout<<root[l][r]<<" ";
if(l==r) return;
print(l,root[l][r]-1);
print(root[l][r]+1,r);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) dp[i][i]=a[i],root[i][i]=i;
for(int len=2;len<=n;len++){
for(int i=1;i+len-1<=n;i++){
int j=i+len-1;
dp[i][j]=dp[i][i]+dp[i+1][j];
root[i][j]=i;
for(int r=i+1;r<j;r++){
if(dp[i][r-1]*dp[r+1][j]+dp[r][r]>dp[i][j]){
dp[i][j]=dp[i][r-1]*dp[r+1][j]+dp[r][r];
root[i][j]=r;
}
}
}
}
cout<<dp[1][n]<<endl;
print(1,n);
return 0;
}