nyoj 214

时间:2023-03-09 15:49:21
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