hdu5125(LIS)

Posted chenhuan001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu5125(LIS)相关的知识,希望对你有一定的参考价值。

相当于用多个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)的主要内容,如果未能解决你的问题,请参考以下文章

hdu1160 LIS变形

HDU 4352:XHXJ's LIS

hdu 6197 array array array LIS

HDU - 4352 - XHXJ's LIS(数位DP)

HDU 1087 Super Jumping! Jumping! Jumping! (DP+LIS)

hdu5406 CRB and Apple dp+两个LIS