有人说这个是最长上升子序列,但是我没有发现。。。
就是找出最长不交叉的DNA片段的序号,只是按照基本的动态规划写了一下。。。
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#define N 1005
int a[N];
struct gene{
int start;
int end;
int pos;
}g[N];
int cmp(const void *a,const void *b)
{
struct gene *c = (struct gene *)a;
struct gene *d = (struct gene *)b;
return c->end - d->end;
}
int main()
{
int i,j,n,end,count;
while(scanf("%d",&n)!=EOF && n)
{
for(i=0;i<n;i++){
scanf("%d%d",&g[i].start,&g[i].end);
g[i].pos=i+1;
}
qsort(g,n,sizeof(g[0]),cmp);
end=0; count=0;
memset(a,0,sizeof(a));
for(i=0;i<n;i++){
for(j=0;j<=i;j++){
if(j!=i){
if(g[j].start>end && g[j].end<=g[i].start){
end=g[j].end;
a[count++]=g[j].pos;
}
}
else{
if(g[j].start>end){
end=g[j].end;
a[count++]=g[j].pos;
}
}
}
}
for(i=0;i<count-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[count-1]);
}
return 0;
}