最长上升子序列问题。。。当然要先排序。。。下一个的开始点必须大于上一个的结束点。。。同时要记录每一个外显子在排序前的位置,因为输出时需要。。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Gene
{
int b;
int e;
int p; //记录排序前的位置
}a[1005];
int cmp(const void *x,const void *y){
struct Gene *c=(struct Gene *)x;
struct Gene *d=(struct Gene *)y;
if(c->b==d->b) return c->e - d->e;
else return c->b - d->b;
}
int main()
{
int n,i,j,k,f[1005],len;
while(scanf("%d",&n),n){
for(i=0;i<n;i++){
scanf("%d %d",&a[i].b,&a[i].e);
a[i].p=i+1;
}
memset(f,0,sizeof(f));
qsort(a,n,sizeof(a[0]),cmp);
f[0]=0; len=0;
for(i=1;i<n;i++){
if(a[i].b>a[f[len]].e){
len++;
f[len]=i; //记录符合条件的序列的序号
}
else if(a[i].e<a[f[len]].e)
f[len]=i;
}
for(i=0;i<len;i++) printf("%d ",a[f[i]].p);
printf("%d\n",a[f[len]].p);
}
// system("pause");
return 0;
}