求助
查看原帖
求助
201971
william_zy楼主2021/10/2 11:50
#include<bits/stdc++.h>
using namespace std;
//#define ll long long
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();
		//cout<<"flag:"<<flag<<endl;
		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

求助,怎么剪枝优化

2021/10/2 11:50
加载中...