首先得明白一个概念:子序列不一定是连续的,可以是断开的。

有两种写法:

一、动态规划写法

复杂度:O(n^2)

代码:

 #include <iostream>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define INF 0x3f3f3f3f using namespace std;
typedef long long ll;
const int maxn = ;
int a[maxn],dp[maxn]; int main()
{
ios::sync_with_stdio(false);
int n;
while(cin>>n && n)
{
for(int i = ; i<n; i++)
cin>>a[i];
int mmax = -;
for(int i = ; i<n; i++)
{
dp[i] = ;
for(int j = ; j<i; j++)//遍历之前的每一个元素pre
{
if(a[j]<a[i] && (dp[j]+>dp[i]))//如果元素pre < 当前元素cur,而且pre的长度+1要比当前的长度多就更新当前的长度
{
dp[i] = dp[j]+;
}
}
mmax = max(mmax,dp[i]);//维护最大的长度
}
printf("%d\n",mmax);
}
return ;
}

二、low_bound写法

复杂度:O(nlogn)

这种写法就是将动规写法中的第二层的遍历改为了二分查找。所以复杂度变为O(nlogn)

牛客讲解视频

该算法中开了一个辅助数组h来表示该长度下最后的元素的最小值。例如 1、2、0、5 、-1

为什么要修改h数组里边的数为小的值呢,因为修改后h数组能变长的潜力就增大了,所以要修改。

代码:

 #include <iostream>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define INF 0x3f3f3f3f using namespace std;
typedef long long ll;
const int maxn = ;
int a[maxn],dp[maxn]; int main()
{
ios::sync_with_stdio(false);
int n;
while(cin>>n)
{
memset(a,,sizeof(a));
for(int i = ; i<n; i++)
dp[i] = INF;
for(int i = ; i<n; i++)
cin>>a[i];
int mmax = -;
for(int i = ; i<n; i++)
{
int k = lower_bound(dp, dp+n, a[i])-dp;
dp[k] = a[i];
mmax = max(mmax, k+);
}
printf("%d\n",mmax);
}
return ;
}

最新文章

  1. P3381 【模板】最小费用最大流
  2. error C2504 类的多层继承 头文件包含
  3. SC.UI
  4. 40. Interleaving String
  5. 在CentOS安装cobbler自动化部署软件
  6. Android各个文件夹对应的分辨率?
  7. 【poj2891-Strange Way to Express Integers】拓展欧几里得-同余方程组
  8. [GeekBand]C++高级编程技术(2)
  9. iOS开发——点击图片全屏显示
  10. sqlserver自定义函数
  11. 天上掉Pizza
  12. struts标签怎么判断request里的属性是否为空 &lt;s:if test=&quot;${list==null}&quot;&gt; &lt;/s:if&gt;
  13. LeetCode算法题-Third Maximum Number(Java实现-四种解法)
  14. queryset优化 。。。。。exists()与iterator()方法
  15. BDD 与DSL 入门
  16. .NET创建一个即是可执行程序又是Windows服务的程序
  17. 获取【酷我音乐】歌曲URL地址
  18. error:No buffer space available (maximum connections reached
  19. PHP在 win7 64位 旗舰版 报错 Call to undefined function curl_init()
  20. 汇编_指令_LEA和MOV的区别

热门文章

  1. HDOJ 题目5289 Assignment(RMQ,技巧)
  2. ios15--综合小例子
  3. oc70--NSArray1
  4. mysql创建用户,并授予权限
  5. 【Codevs1322】单词矩阵
  6. Frequent values(线段树+离散化)
  7. [Swift通天遁地]九、拔剑吧-(8)创建气泡式页面切换效果
  8. GoLang 编译exe添加ICO图标
  9. RHEL6.5 设置yum,IP地址,解压缩
  10. 解决Logger在Android Studio 3.1版本无法正常加载tag格式