poj1631最长递增字序列

来源:互联网 发布:国产户外品牌 知乎 编辑:程序博客网 时间:2024/06/05 07:16

这题也是简单的动态规划,只不过数据是40000,进行一般的话时间复杂度是O(n^2),可以用化简的算法,即用一个数组每次记录最长的并且是最小的递增子序列,然后进行更新的!

例子:4  2  6   3  1  5

数组a用来记录的是最小的递增数列的

第一步 数组为 4

第二部 数组为 2(进行更新)

第三步 数组为2 6(进行插入)

第四步 数组为2 3(进行替换)

第五步 数组为2 3(不改变)

第六步 数组为2 3 5(插入)

所以最长递增子数列为数组的长度为3

#include<iostream>using namespace std;int main(){int a[40005];int T,n,s,i,j;cin>>T;while(T--){cin>>n;i=0;a[i]=INT_MAX;while(n--){             cin>>s; if(s>a[i])//进行插入的 { i++; a[i]=s; continue; } for(j=i; j>=1; j--) { if(s<a[j] && s>a[j-1]) { a[j]=s; break; } } if(s<a[0]) a[0]=s;}cout<<i+1<<endl;}return 0;}

 

 

原创粉丝点击