找出最高一个线段覆盖吧,很明显的O(n^2)的DP,注意排序的时候按长度排序。WA了一次,没有注意到题目中their endpoints do not coincide,他们的端点不能重合,我还以为输出要顺序有错误。。。得亏又看了遍题目。。
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 struct segment 5 { 6 int x,y,len; 7 int num; 8 }p[501]; 9 int o[501],k[501],q[501]; 10 int cmp(const void *a,const void *b) 11 { 12 return (*(struct segment *)a).len > (*(struct segment *)b).len?1:-1; 13 } 14 int main() 15 { 16 int i,j,n,t,max; 17 scanf("%d",&n); 18 for(i = 0;i <= n-1;i ++) 19 { 20 scanf("%d%d",&p[i].x,&p[i].y); 21 p[i].len = p[i].y-p[i].x; 22 p[i].num = i; 23 } 24 qsort(p,n,sizeof(p[0]),cmp); 25 o[0] = 1;k[0] = 0; 26 for(i = 1;i <= n-1;i ++) 27 { 28 max = 0;t = i; 29 for(j = 0;j <= i-1;j ++) 30 { 31 if(p[i].x < p[j].x&&p[i].y > p[j].y) 32 { 33 if(o[j] > max) 34 { 35 max = o[j]; 36 t = j; 37 } 38 } 39 } 40 o[i] = max+1; 41 k[i] = t; 42 } 43 max = 0;t = 0; 44 for(i = 0;i <= n-1;i ++) 45 { 46 if(max < o[i]) 47 { 48 max = o[i]; 49 t = i; 50 } 51 } 52 printf("%d\n",max); 53 for(i = 1;i <= max;i ++) 54 { 55 q[i] = p[t].num+1; 56 t = k[t]; 57 } 58 for(i = max;i >= 1;i --) 59 { 60 if(i == max) 61 printf("%d",q[i]); 62 else 63 printf(" %d",q[i]); 64 } 65 printf("\n"); 66 return 0; 67 }