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 |
wa的不行了....达人指点一下...那里错了#include<iostream.h> #include<stdlib.h> typedef struct lll { long long x,y; }Line; Line a[1000]; long long n; long long map[1000][1000]; int cmp(const void*a,const void*b) { Line aa,bb; aa=*(Line*)a; bb=*(Line*)b; if(aa.y!=bb.y) { if(aa.y>bb.y) return 1; else return -1; } else { if(aa.x>bb.x) return 1; else if(aa.x==bb.x) return 0; else return -1; } } long long dfs(long long ii,long long now)//从下标ii->n中去now个不相交的线段方案数 { long long tp,i,j; if(now==1) return n-ii; if(map[ii][now]!=-1l) return map[ii][now]; tp=0; for(i=ii;i<n-now;i++) { for(j=i+1;j<n-now+1;j++) if(a[j].x>=a[i].y) break; if(j<n) tp+=dfs(j,now-1); } map[ii][now]=tp; return tp; } main() { long long i,j,edg,k; while(cin>>n) { for(i=0;i<n;i++) { cin>>a[i].x>>a[i].y; if(a[i].x>a[i].y)//x存首端点..y存尾端点.. { k=a[i].x; a[i].x=a[i].y; a[i].y=k; } } for(i=0;i<=n;i++) for(j=0;j<=n;j++) map[i][j]=-1l; qsort(a,n,sizeof(a[0]),cmp); //按y排序 edg=a[0].y; //贪心求最大可剩余的线段数 k=1; for(i=1;i<n;i++) if(a[i].x>=edg) { k++; edg=a[i].y; } j=dfs(0,k); //选取不相交的k个线段方案数..对应擦除n-k条直线方案数 cout<<n-k<<" "<<j<<endl; } } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator