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 }