码迷,mamicode.com
首页 > 其他好文 > 详细

hdu5125(LIS)

时间:2016-03-22 20:40:28      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

相当于用多个O(nlog(n))LIS来做。

//
//  main.cpp
//  160322
//
//  Created by 陈加寿 on 16/3/22.
//  Copyright © 2016年 chenhuan001. All rights reserved.
//

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <vector>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 1100

int a[N],b[N];
vector<int> dp[N];

int main() {
    int T;
    cin>>T;
    while(T--)
    {
        int n,m;
        cin>>n>>m;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",a+i,b+i);
            dp[i].clear();
        }
        
        int ans=0;
        ans = 1;
        for(int i=0;i<=m;i++)
        {
            dp[i].push_back(a[0]);
        }
        for(int i=1;i<=m;i++)
        {
            if(a[0]>b[0])
            {
                dp[i][0]=b[0];
            }
        }
        
        vector<int>::iterator p;
        for(int i=1;i<n;i++)
        {
            for(int j=m;j>=0;j--)
            {
                if(j!=m)
                {
                    p =lower_bound(dp[j].begin(), dp[j].end(), b[i]);
                    if(p==dp[j].begin())
                    {
                        dp[j+1][0] = min(dp[j+1][0],b[i]);
                    }
                    else if(p==dp[j].end()) //我这等于最后
                    {
                        int sz=dp[j].size();
                        if(dp[j+1].size() == sz)
                        {
                            dp[j+1].push_back(b[i]);
                            ans = max(ans,sz+1);
                        }
                        else dp[j+1][sz]=min(dp[j+1][sz],b[i]);
                    }
                    else
                    {
                        int cnt = p-dp[j].begin();//这一步我不知道可不可以这样用。。
                        dp[j+1][cnt] = min(dp[j+1][cnt],b[i]);
                    }
                }
                
                p = lower_bound(dp[j].begin(), dp[j].end(), a[i]);
                if(p==dp[j].begin()) //说明所有数都大于a[i]
                {
                    dp[j][0]=a[i];
                }
                else if(p==dp[j].end())
                {
                    dp[j].push_back(a[i]);
                    ans = max(ans,(int)dp[j].size());
                }
                else
                {
                    *p = a[i];
                }
            }
        }
        
        cout<<ans<<endl;
    }
    return 0;
}

 

hdu5125(LIS)

标签:

原文地址:http://www.cnblogs.com/chenhuan001/p/5308308.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!