编程之美2.16最长递增子序列

来源:互联网 发布:清茶淘宝助手充值卡 编辑:程序博客网 时间:2024/06/05 06:33

思想:

对每一个长度建立其最大值的记录maxV,当输入一个新值v时,找到最大值小于v的最后一个索引i,若i为maxV的最后一个索引,则最大长度maxL+1,否则maxV[i+1]=v;

代码:

#include <iostream>#include <vector>#include <string>#include <cmath>#include <sstream>#include <bitset>using namespace std;int find_index(vector<int> vec,int v)   //找到最后一个<=v的索引{int l=0,r=vec.size()-1;while (l<r){int mid = (l+r+1)/2;if (vec[mid]<v){l = mid;}else{r = mid-1;}}if (l==r&&vec[l]<v) return l;return -1;}int longestIncrementSequence(vector<int> &seq){if (seq.size()==0) return 0;vector<int> maxV;int maxL = 1;maxV.push_back(seq[0]);int index;for (int i=1;i<seq.size();++i){index = find_index(maxV,seq[i]);if (index!=-1){if (index==maxV.size()-1){maxL++;maxV.push_back(seq[i]);}else{maxV[index+1] = seq[i];}}if (maxV.size()==1&&maxV[0]>seq[i]){maxV[0] = seq[i];}}return maxL;}int main(){vector<int> v;int n;while (cin>>n){while (n--){int m;cin>>m;v.push_back(m);}cout<<longestIncrementSequence(v)<<endl;}}


0 0
原创粉丝点击