hdu1677 转换LIS

题目大意:将小的布娃娃套进大的布娃娃总共需要多少个布娃娃。

思路:按宽度作为第一关键字升序排列,高度作为第二关键字降序排列,则高度的LIS就是所求的解。因为宽度是高到低,所以前面的必定能被LIS序列里面的某个数套进去,还有因为20 10不能套进20 10.所以在求LIS是不能用lower_bound(),因为lower_bound()求得是他所处位置但是在等于他本身那个数字的前面。所以要用upper_bound(),就可以了。。


#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iostream>
#include <iomanip>

using namespace std;
#define maxn 20055
#define MOD 1000000007
#define mem(a) memset(a , 0 , sizeof(a))
#define memx(a) memset(a , 0x7f , sizeof(a))
#define LL __int64
#define INF 999999999
struct node
{
    int w , h;
}arr[maxn];
int g[maxn];

bool cmp(node n1 , node n2)
{
    if(n1.w == n2.w) return n1.h < n2.h;
    else return n1.w > n2.w;
}

int main()
{
    int t;
    scanf("%d" , &t);
    while(t--)
    {
        int n ;
        scanf("%d" , &n);
        for(int i = 0 ; i < n ; i ++) scanf("%d %d" , &arr[i].w , &arr[i].h);
        sort(arr , arr + n , cmp);
        memx(g);
        int ans = 0;
        for(int i = 0 ; i < n ; i ++)
        {
            int k = upper_bound(g , g + n , arr[i].h) - g;
            g[k] = arr[i].h;
            ans = max(ans , k+1);
        }
        printf("%d\n" , ans);
    }
    return 0;
}

/*
10
4
30 10 20 13 20 14 20 15
4
10 10 20 10 20 10 30 25
4
10 15 20 10 20 30 30 25
3
20 30 40 50 30 40
4
20 30 10 10 30 20 40 50
3
10 30 20 20 30 10
4
10 10 20 30 40 50 39 51
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值