include
using namespace std;
const int maxn=35;
long long int score[maxn][maxn];
int vi[maxn];
int root[maxn][maxn];//用来存l-r之间的根节点
void printt(int l,int r)
{
if(l>r) return;
cout<<root[l][r]<<" ";
printt(l,root[l][r]-1);
printt(root[l][r]+1,r);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;cin>>n;
memset(score,0,sizeof(score));
for(int i=1;i<=n;i++) cin>>vi[i];
for(int i=1;i<=n;i++) root[i][i]=i;
for(int i=1;i<=n;i++) score[i][i]=vi[i];
for(int len=2;len<=n;len++){
for(int i=1;i+len-1<=n;i++){
int j=i+len-1;
for(int k=i;k<=j;k++){
if(k==i){
if(score[i][j]<score[k+1][j]+vi[k]){
root[i][j]=k;
score[i][j]=score[k+1][j]+vi[k];
}
}
else if(k>i&&k<j){
if(score[i][j]<score[i][k-1]*score[k+1][j]+vi[k]){
root[i][j]=k;
score[i][j]=score[i][k-1]*score[k+1][j]+vi[k];
}
}
else if(k==j){
if(score[i][j]<score[i][k-1]+vi[k]){
root[i][j]=k;
score[i][j]=score[i][k-1]+vi[k];
}
}
}
}
}
cout<<score[1][n]<<endl;
printt(1,n);
}
兄弟,你这个格式出现了鬼畜。下次可以在代码前后加上这个:
(上面的没有反斜线)