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