hdu 1677

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1677

题意:俄罗斯套娃是一种有宽w和高h两种属性的玩具。当wi < wj && hi < hj的时候,套娃i能被套在套娃j里。现在给出m个套娃的宽和高,问最少能套出几个套娃。

mark:首先按宽度从大到小排序,得到结果以后按高度求最长非降子序列(LIS)。这题和导弹拦截系统问题一样,是经典dp。

一开始偷懒写了贪心结果TLE了。

代码:

 1 # include <stdio.h>
 2 # include <stdlib.h>
 3 # include <string.h>
 4 
 5 
 6 typedef struct DOLL{
 7     int w, h ;
 8 }DOLL ;
 9 
10 DOLL a[20010] ;
11 int b [20010] ;
12 int dp[10010] ;
13 
14 
15 int cmp(const void *a, const void *b)
16 {
17     DOLL *p = (DOLL*)a, *q = (DOLL*)b ;
18     if (p->w != q->w) return q->w - p->w ;
19     return p->h - q->h ;
20 }
21 
22 
23 int LIS(int n)
24 {
25     int i, j, rtn = 0 ;
26     memset (dp, 0, sizeof(dp)) ;
27     for (i = 0 ; i < n ; i++)
28     {
29         for (j = 0 ; j < rtn ; j++)
30             if (b[j] > b[i]) break ;
31         if (j == rtn) rtn++ ;
32         b[j] = b[i] ;
33     }
34     return rtn ;
35 }
36 
37 
38 int main ()
39 {
40     int T, i, j, n, ans, p ;
41     scanf ("%d", &T) ;
42     while (T--)
43     {
44         scanf ("%d", &n) ;
45         for (i = 0 ; i < n ; i++)
46             scanf ("%d%d", &a[i].w, &a[i].h) ;
47         qsort(a, n, sizeof(DOLL), cmp) ;
48         for ( i = 0 ; i < n ; i++)
49             b[i] = a[i].h ; 
50         printf ("%d\n", LIS(n)) ;
51     }
52     
53     return 0 ;
54 }
posted @ 2012-04-11 02:42  Seraph2012  阅读(253)  评论(0编辑  收藏  举报