刷題——Bridging signals POJ - 1631

/*
每條線本來都要按1-1 2-2 n-n的方式相連,現在亂了
問切除掉一部分線之後,剩下的不相交的線有多少


若有部分線相連的線的序號是遞增的那麼這部分線就是不相交的
所以就是求最大上升子序列(LIS)
*/
#include <stdio.h>
int p[40005];
int bSearch(int num,int k)
{
    int low=1,high=k;
    while(low<=high)
    {
        int mid=(low+high)/2;
        if(num>=p[mid])
        low=mid+1;
        else
        high=mid-1;
    }
    return low;
}
int LIS(int n)
{
    int low=1,high=n;
    int k=1;
    for(int i=2;i<=n;++i)
    {
        if(p[i]>p[k])
        p[++k]=p[i];
        else
        {
            int pos=bSearch(p[i],k);
            p[pos]=p[i];
        }
    }
    return k;
}
int main(){
    int t,n;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&p[i]);
        }
        printf("%d\n",LIS(n));
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章