求助状压dp的部分
查看原帖
求助状压dp的部分
305296
云雷心柠檬听楼主2024/1/24 11:47

主要就是这一部分代码

TE 但是没有找到可以优化的地方

感觉理论上没有问题,实践上出现了问题

void solveDP(){
	ans=0;
	id.clear();
	for(ll i=1;i<=n;i++){
		string s;
		cin>>s;
		id[s]=i;
	}
	for(ll i=1;i<=m;i++){
		cin>>s_1[i]>>s_2[i]>>s_3[i];
	}
	for(ll i=1;i<(1<<m);i++){
		for(ll j=1;j<=m;j++){
			f[i][j]=0;
			if(((i>>(j-1))&1)==0) continue;
			ll lst=i-(1<<(j-1));
//			cout<<i<<" "<<j<<" "<<lst<<"\n";
			for(ll k=1;k<=m;k++){
				if(((lst>>(k-1))&1)==0) continue;
				if(f[i][j]>f[lst][k]+chkadd(k,j)) continue;
				f[i][j]=max(f[i][j],f[lst][k]+chkadd(k,j));
				llst[i][j]=k;
			}
//			cout<<i<<" "<<j<<"="<<llst[i][j]<<"\t";
		}
//		cout<<"\n";
	}
	ll mx=0;
	for(ll i=1;i<=m;i++){
		if(ans>f[(1<<m)-1][i]) continue;
		ans=max(ans,f[(1<<m)-1][i]);
		mx=i;
	}
	cout<<ans<<"\n";
	ll x=(1<<m)-1,nw=mx; nT=0;
	for(ll i=1;i<=m;i++){
//		cout<<mx<<"\n";
		stk[++nT]=mx;
		mx=llst[x][mx];
		x-=(1<<(nw-1));
		nw=mx;
	}
	for(ll i=nT;i>=1;i--) cout<<stk[i]<<" "; cout<<"\n";
}
2024/1/24 11:47
加载中...