ACwing896-最长上升子序列(2)
最长上升子序列(2)
链接:https://www.acwing.com/problem/content/898/
来源:ACWing 算法基础课
题目描述
给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。
输入格式
第一行包含整数 N。
第二行包含 N 个整数,表示完整序列。
输出格式
输出一个整数,表示最大长度。
数据范围
1≤N≤100000
−109≤数列中的数≤109
输入样例:
1 | 7 |
输出样例:
1 | 4 |
算法描述
本题数据范围较大,不宜使用双层for循环+DP的方法进行编写。
则采用优化进阶版的二分算法来进行编写
状态表示
找到相应的上升子序列长度结尾的最小值,每次都这样找的话就可以找到一个呈现递增状态的数组,递增状态的属性满足了使用二分的基本规则
状态计算(集合划分)
使用dp[len]来记录当0~len各个长度下的最小值
当a[i]>dp[len]中的所有值时,len的长度要增加
更新a[i]成为1~len的某个长度下的最小值
笔者代码
1 | import java.util.Scanner; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 随意!
评论
ValineDisqus




