Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
改了一下,超时了,不知怎样剪枝了。高手麻烦看一下。。。In Reply To:Re:是WA,高手麻烦指点一下... Posted by:luckystar at 2007-08-27 13:13:53 #include<iostream> using namespace std; /*最优化剪枝:如果当前搜到的s+f的值加上后面最多能达到的s+f的值小于已经搜得的最大值,就退出; 可行性剪枝:如果当前搜到的s(或f)值<0,那么如果s(或f)加上后面最多能得到的s(或f)值<0,就退出。*/ struct point { int x,y; }; int max; int ms,mx,my; point p[101]; int mins[101],minx[101],miny[101]; int j; int cmp(const void *a, const void *b) { return((*(point *)b).x+(*(point *)b).y)-((*(point *)a).x+(*(point *)a).y); } void dfs(int i,int s,int x,int y)//i表示搜到第几点。 { if(s>max&&x>=0&&y>=0) max=s; if(i==j) return ; if((s+mins[i])<max)//剪枝 return ; if((x<0)&&(x+minx[i]<0))//剪枝 return ; if((y<0)&&(y+miny[i]<0))//剪枝 return ; dfs(i+1,s,x,y); dfs(i+1,s+p[i].x+p[i].y,x+p[i].x,y+p[i].y); } main() { int i,k,n,a,b; cin>>n; j=0; max=0; ms=0;mx=0; my=0; for(i=0;i<n;i++) { cin>>a>>b; if(a>=0&&b>=0) { mx+=a; my+=b; ms=ms+a+b; } else if(a+b>=0) { p[j].x=a; p[j].y=b; j++; } else if(a+b<0&&a*b<0) { p[j].x=a; p[j].y=b; j++; } } qsort(p, j, sizeof(point), cmp); if(p[j-1].x+p[j-1].y>0) mins[j-1]=p[j-1].x+p[j-1].y;//求后面最多能达到的s+f的值,和后面最多能得到的s(或f)值 else mins[j-1]=0; if(p[j-1].x>0) minx[j-1]=p[j-1].x; else minx[j-1]=0; if(p[j-1].y>0) miny[j-1]=p[j-1].y; else miny[j-1]=0; for(k=j-2;k>=0;k--) { if(p[k].x>0) minx[k]=p[k].x+minx[k+1]; else minx[k]=minx[k+1]; if(p[k].y>0) miny[k]=p[k].y+miny[k+1]; else miny[k]=miny[k+1]; if(p[k].x+p[k].y>0) mins[k]=p[k].x+p[k].y+mins[k+1]; } dfs(0,ms,mx,my); cout<<max<<endl; return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator