剪枝威力这么大吗
查看原帖
剪枝威力这么大吗
250699
mot1ve楼主2022/11/19 18:24

就用了三个最优化剪枝,结果直接过了n=400的数据,这也太离谱了吧,感觉这个剪枝在随机数据下也不是很厉害啊

//前缀和剪枝优化
#include<bits/stdc++.h>
using namespace std;
int n,ans,nowS,nowF;
int S[410],F[410],sumS[410],sumF[410],sum[410];//标记 
void dfs(int x,int nowS,int nowF)
{
	if(nowS>=0&&nowF>=0)
	ans=max(ans,nowS+nowF);
	if(x>n)
	return ;
	if(nowS+sumS[n]-sumS[x-1]<0)
	return ;
	if(nowF+sumF[n]-sumF[x-1]<0)
	return ;
	if(nowS+nowF+sum[n]-sum[x-1]<=ans)//最优化剪枝 
	return ;
	if(S[x]<=0&&F[x]<=0)
	{
		dfs(x+1,nowS,nowF);
	}
	if(S[x]>=0&&F[x]>=0)
	{
		dfs(x+1,nowS+S[x],nowF+F[x]);
	}
	dfs(x+1,nowS,nowF);
	dfs(x+1,nowS+S[x],nowF+F[x]);
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&S[i],&F[i]);
	}
	for(int i=1;i<=n;i++)
	{
		sumS[i]=sumS[i-1]+max(0,S[i]);
		sumF[i]=sumF[i-1]+max(0,F[i]);
		sum[i]=sum[i-1]+max(0,S[i]+F[i]);	
	}
	dfs(1,0,0);
	cout<<ans;
	return 0;
} 
2022/11/19 18:24
加载中...