就用了三个最优化剪枝,结果直接过了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;
}