nyoj 214

//nyoj 214
这个题目和字符串的问题类似,都是给出一组数据,寻找最长的单调递增字符

这一题一开始我用dp做,发现超时,看了下时间,n*n的复杂度,换过一种思路

用类似于栈的方式,来存储每次更新过后的单调序列,里面二分查找很容易理解

就是数组作用开始比较难理解,大致思路是先把输入数组的第一个元素放入Stack数组里

然后一个for,从第二个元素开始,if每次判断和top顶元素大小,逐次叠加上递增的序列

如果不满足,用二分法查找到a[i]应该放在Stack数组的适合位置

这个适合位置就是Stack数组按字典序的顺序排列。。。

所以数组Stack就相当于更新最长的序列,最后只要输出Stack数组的top顶值就可以。。。。

 

#include <iostream>
using namespace std;
int main()
{
    int t,i,a[100001],Stack[100001];
    while(cin>>t,!cin.eof())
    {
        for(i=0;i<t;i++)
            cin>>a[i];
            Stack[1]=a[0];
            int top=1;
            for(i=1;i<t;i++)
            {
                if(a[i]>Stack[top])
                    Stack[++top]=a[i];
                else
                {
                    int low=1,high=top;
                    while(low<=high)
                    {
                        int mid=(low+high)/2;
                        if(a[i]>Stack[mid])
                            low=mid+1;
                        else
                            high=mid-1;
                    }
                    Stack[low]=a[i];
                }
            }
            cout<<top<<endl;
    }return 0;
}
//nyoj 214


 

posted @ 2014-12-11 14:38  __夜风  阅读(135)  评论(0编辑  收藏  举报