DP_NYOJ17/NYOJ79最长单调子序列

题目地址:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=17

大致描述:给出一个字符串序列,要求找出最长的单调递增的子序列,比如:aaa 它的最长单调递增子序列为a 输出1 序列abklmncdefg 它的最长单调递增子序列是 abcdefg 输出7

/*************************************************************
 * > File Name: 单调递增最长子序列.cpp
 * > Author: weigang
 * > Mail: w_wg@qq.com 
 * > Created Time: 2018年05月21日 星期一 21时11分48秒
 *************************************************************/

#include<bits/stdc++.h>
using namespace std;
int LIS(char * s,int n)
{
    char lis[n+1];
    int max_len = 1;
    lis[0] = '0';
    lis[1] = s[0];
    for(int i = 1; i < n+1; i++)
    {
        int lift = 1,right = max_len;
        while(lift < right)
        {
            int mid = (lift + right)/2;
            if(lis[mid] <= s[i])
                lift = mid+1;
            else if(lis[mid] > s[i]) 
                right = mid;
        }

        if( (lis[right] > s[i]) && (lis[right-1] < s[i]) )
            lis[right] = s[i];
        else if(lis[right] < s[i])
        {
            lis[right+1] = s[i];
            ++max_len;
        }
    }

    return max_len;
}
int main(void)
{
    int N;
    scanf("%d",&N);
    while(N--)
    {
        char s[10005];
        int len;
        scanf("%s",s);
        len = strlen(s);
        printf("%d\n",LIS(s,len));
    }

    return 0;
}

 最长单调递减子序列

题目地址http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=79

题目大意:找出序列中最长的单调递减的子序列

/*************************************************************
 * > File Name: 079_拦截导弹.cpp
 * > Author: weigang
 * > Mail: w_wg@qq.com 
 * > Created Time: 2018年05月23日 星期三 13时49分41秒
 *************************************************************/

#include<bits/stdc++.h>
using namespace std;
int a[22],d[25];
int f(int n)
{
    int count = 0,max = 1;
    d[0] = INT_MAX;
    d[1] = a[0];
    for(int i = 1; i < n; ++i)
    {
        int lift = 1,right = max;
        while(lift < right)
        {
            int mid = (lift + right) >> 1;
            if(a[i] > d[mid])
                right = mid;
            else
                lift = mid+1;
        }
        if( a[i] < d[right] )
        {
            d[right+1] = a[i];
            max++;
        }
        else if( (a[i] > d[right]) && (a[i] < d[right-1])) 
            d[right] = a[i];
    }

    return max;
}
int main(void)
{
    int N;
    cin >> N;
    while(N--)
    {
        memset(a,0,22);
        memset(d,0,25);
        int n,i;
        cin >> n;
        for(i = 0; i < n; ++i)
        {
            scanf("%d",&a[i]);
        }
        cout << f(n) << endl;
    }

    return 0;
}

 

posted @ 2018-05-22 15:58  凉菜花生小酒  阅读(103)  评论(0)    收藏  举报