您的位置:首页 > 其它

hdu 1677

2012-04-11 02:42 330 查看
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1677

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

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

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

代码:

# include <stdio.h>
# include <stdlib.h>
# include <string.h>

typedef struct DOLL{
int w, h ;
}DOLL ;

DOLL a[20010] ;
int b [20010] ;
int dp[10010] ;

int cmp(const void *a, const void *b)
{
DOLL *p = (DOLL*)a, *q = (DOLL*)b ;
if (p->w != q->w) return q->w - p->w ;
return p->h - q->h ;
}

int LIS(int n)
{
int i, j, rtn = 0 ;
memset (dp, 0, sizeof(dp)) ;
for (i = 0 ; i < n ; i++)
{
for (j = 0 ; j < rtn ; j++)
if (b[j] > b[i]) break ;
if (j == rtn) rtn++ ;
b[j] = b[i] ;
}
return rtn ;
}

int main ()
{
int T, i, j, n, ans, p ;
scanf ("%d", &T) ;
while (T--)
{
scanf ("%d", &n) ;
for (i = 0 ; i < n ; i++)
scanf ("%d%d", &a[i].w, &a[i].h) ;
qsort(a, n, sizeof(DOLL), cmp) ;
for ( i = 0 ; i < n ; i++)
b[i] = a[i].h ;
printf ("%d\n", LIS(n)) ;
}

return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: