#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,fs[102],first[102],cur,ans=-4E10,curr;
bool flag;
#define tree node*
#define t T
struct node{
tree l,*r;
ll idx,k;
ll calc(){
if(l==NULL){
if(r==NULL){
return idx;
}
return idx+r->calc();
}
else if(r==NULL){
return idx+l->calc();
}
return l->calc()*r->calc()+idx;
}
void first(){
::first[++curr]=k;
if(l!=NULL){
l->first();
}
if(r!=NULL){
r->first();
}
}
void mid(){
if(!flag)return;
if(l!=NULL){
l->mid();
}
fs[++cur]=k;
if(fs[cur]-fs[cur-1]!=1){
flag=NULL;return;
}
if(r!=NULL){
r->mid();
}
}
node(){
l=r=NULL;
idx=0;
}
};
node T[1992];
bool used[1002];
ll r;
void dfs(register short root,register short sum){
if(sum==n){
flag=1;
cur=0;
T[root].mid();
if(flag){
r=T[root].calc();
if(r>ans){
ans=r;
curr=0;
T[root].first();
}
}
return;
}
for(register int i=1;i<=n;i++){
if(!used[i]){
used[i]=1;
for(register int j=1;j<=n;j++){
if(j!=i){
if(T[j].l==NULL){
T[j].l=&T[i];
dfs(root,sum+1);
T[j].l=NULL;
}
if(T[j].r==NULL){
T[j].r=&T[i];
dfs(root,sum+1);
T[j].r=NULL;
}
}
}
used[i]=0;
}
}
}
int main(){
cin>>n;
for(register short i=1;i<=n;i++){
cin>>T[i].idx;
T[i].k=i;
}
for(register short i=1;i<=n;i++){
used[i]=1;
dfs(i,1);
used[i]=0;
}
cout<<ans<<endl;
for(register int i=1;i<=n;i++){
cout<<first[i]<<' ';
}
}
4个TLE
求助,怎么剪枝优化