最长上升子序列(LIS)
给定一个长度为N的序列A
满足:
1. 1<=x1< x2< x3<…xk<=N
2. A[x1] < A[x2] < A[x3] < … < A[xk]
即寻找一个最长子序列,满足该子序列中每个元素严格递增(其实不严格递增也可以做)
做最长上升子序列有两种方法:

1.动态规划(O(n2))

dp[i]表示取到第i个数的最长上升子序列
若有j满足a[j] < a[i]
dp[i]=max(dp[j])+1
否则dp[i]=1
直接贴代码

#include<cstdio>
long long n,a[10001],dp[10001],ans=0;
int main()
{scanf("%lld",&n);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);for(int i=1;i<=n;i++){dp[i]=1;for(int j=1;j<i;j++)if(a[j]<a[i]&&dp[i]<=dp[j])dp[i]=dp[j]+1;}for(int i=1;i<=n;i++)if(ans<dp[i])ans=dp[i];printf("%lld",ans);return 0;
}

2.贪心?(O(nlogn))

用一个栈维护最长上升子序列的第i个元素的最小值,显然这个最小值是单调不减的,进来一个数,如果比栈顶打就压入栈,否则二分更新栈内元素
易懂代码

#include<cstdio>
long long N,a[100001],len,num;
long long search(long long x)
{long long l=1,r=len,ans=0;while(l<=r){long long mid=(l+r)/2;if(a[mid]>=x)ans=mid,r=mid-1;else l=mid+1;}return ans;
}
int main()
{scanf("%lld",&N);for(long long i=1;i<=N;i++){scanf("%lld",&num);if(len==0||num>a[len])a[++len]=num;else a[search(num)]=num;}printf("%lld",len);return 0;
}

经过优化的代码,适合做板子(注意理解)

#include<cstdio>
typedef long long LL;
template <typename T> inline T max(const T a,const T b){return a>b?a:b;}
template <typename T> inline T min(const T a,const T b){return a<b?a:b;}
template <typename T> inline T abs(const T a){return a>0?a:-a;}
template <typename T> inline void swap(T&a,T&b){T c=a;a=b;b=c;}
template <typename T> inline LL log2(T x){register LL res=0;while(x>=2)x=x>>1,res++;return res;}
template <typename T> inline T gcd(const T a,const T b){if(a%b==0)return b;return gcd(b,a%b);}
template <typename T> inline void read(T&x)
{char cu=getchar();x=0;bool fla=0;while(cu<'0'||cu>'9'){if(cu=='-')fla=1;cu=getchar();}while('0'<=cu&&cu<='9')x=x*10+cu-'0',cu=getchar();if(fla)x=-x;
}
template <typename T> void printe(const T x)
{if(x>=10)printe(x/10);putchar(x%10+'0');
}
template <typename T> inline void print(const T x)
{if(x<0)putchar('-'),printe(-x);else printe(x);
}
LL N,a[100001],len,num;
inline LL search(const LL x)
{register LL l=1,r=len,ans=0;while(l<=r){register LL mid=(l+r)>>1;if(a[mid]>=x)ans=mid,r=mid-1;else l=mid+1;}return ans;
}
int main()
{read(N);for(register LL i=1;i<=N;i++){read(num);if(!len||num>a[len])a[++len]=num;else a[search(num)]=num;}print(len);return 0;
}

最长上升子序列(LIS)的求法相关推荐

  1. 最长上升子序列(LIS) nlogn解法

    文章目录 经典DP解法O(n^2) dp+二分法(O(nlogn)) 最长上升子序列LIS:Longest increasing subsequence 题目链接:Leetcode300. 最长递增子 ...

  2. 最长上升子序列(LIS)长度

    转自:http://www.slyar.com/blog/poj-2533-cpp.html POJ 2533 Longest Ordered Subsequence 属于简单的经典的DP,求最长上升 ...

  3. 耐心排序之最长递增子序列(LIS)

    目录 一.问题引入 1.最长递增子序列(LIS) 2.问题分析 3.代码实现 4.问题思考 二.耐心排序 1.基本介绍 2.操作步骤 3.代码实现 三.俄罗斯套娃信封问题 1.题目描述 2.问题分析 ...

  4. 最长上升子序列(LIS),牛客刷题

    目录: 最长上升子序列(LIS) 1.模板(数据较小) 2.模板(数据较大) 牛客刷题 1. 牛客练习赛107A:如见青山 2.牛客小白月赛65A牛牛去购物 3.牛客小白月赛65B牛牛去购物 4.牛客 ...

  5. 最长上升子序列(LIS)长度及其数量

    例题51Nod-1376,一个经典问题,给出一个序列问该序列的LIS以及LIS的数量. 这里我学习了两种解法,思路和代码都是参考这两位大佬的: https://www.cnblogs.com/reve ...

  6. 最长上升子序列 (LIS算法(nlong(n)))

    设 A[t]表示序列中的第t个数,F[t]表示从1到t这一段中以t结尾的最长上升子序列的长度,初始时设F [t] = 0(t = 1, 2, ..., len(A)).则有动态规划方程:F[t] = ...

  7. 最长上升子序列_动态规划 最长上升子序列LIS

    问题描述 最长上升子序列(LIS): 给定长度为n的序列,从中选中一个子序列,这个子序列需要单调递增,请问最长子序列(LIS)的长度? eg:1,5,2,3,11,7,9 则LIS序列为:1,2,3, ...

  8. 最长上升子序列LIS 动态规划 二分查找算法

    所谓LIS表示最长上升子序列,是面试的时候非常容易考察的问题.对于一个序列h1,h2,...hN,其中的子序列hi1,hi2,...hik,满足hi1<hi2<...<hik,那么这 ...

  9. 求最长上升子序列——LIS的O(nlogn)算法(二分)

    LIS的O(nlogn)算法(二分) 传送门:点我 O(n^2)解法:(n为4w,TLE) memset(dp,1,sizeof(dp)); int ans=-1; for(i=2; i<=n; ...

最新文章

  1. RDKit | 基于RDKit和化学信息学探索化学空间
  2. pandas使用query函数基于判断条件获得dataframe中满足条件的数据行(row)的索引列表(index of rows matching conditions in dataframe)
  3. cisco 核心交换机连接两个路由器_CISCO、H3C、华为三层交换机端口二三层切换命令对比...
  4. kruskai算法c语言实现,并查集 - xiaobaoqiu Blog
  5. 多线程锁--怎么理解Condition
  6. TS Annotation
  7. 1038 一元三次方程求解
  8. php网页电话外呼,一种基于web网页端的电话外呼方法与流程
  9. 小米max刷鸿蒙,小米Max刷recovery教程 小米Max第三方recovery下载
  10. 零基础建站教程,教你最快速度做好企业网站
  11. C# DLL资源文件打包(图片、JS、CSS)[WebResource]
  12. python+pyecharts画地图
  13. Educational Codeforces Round 90 (Rated for Div. 2)(D 思维 E 打表)
  14. 外贸公司邮箱怎么申请?往国外邮箱发邮件哪个好用?
  15. 鼠绘-汽车侧面绘制过程
  16. RS422/485规范的偏置/端接电阻取值说明
  17. 基于51单片机的DS18B20温度显示
  18. 知网研学批量添加IEEE英文题注(同一作者),知网研学添加英文题注
  19. 输入三角形三边边长,求三角形的面积
  20. 国内集成电路公司简介

热门文章

  1. Predicate接口练习之筛选满足条件数据
  2. ES6新特性之修饰器
  3. 访问数组元素进行赋值
  4. throws关键字_异常处理的第一种方式,交给别人处理
  5. 从一个极简的微服务架构开始
  6. jconsole工具检测堆内存变化
  7. python整型图_python源码研究之整型对象探索
  8. java 带点的字符串处理,关于android:java中字符串上带点的分割函数
  9. Logtail 文件日志采集之完整正则模式
  10. 用中文传话游戏理解 RNN