最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i

设dp[i]表示以i为结尾的最长递增子序列的长度,则状态转移方程为:

dp[i] = max{dp[j]+1}, 1<=j

这样简单的复杂度为O(n^2),其实还有更好的方法。

考虑两个数a[x]和a[y],x

按dp[t]=k来分类,只需保留dp[t]=k的所有a[t]中的最小值,设d[k]记录这个值,d[k]=min{a[t],dp[t]=k}。

这时注意到d的两个特点(重要):

1. d[k]在计算过程中单调不升;

2. d数组是有序的,d[1]

利用这两个性质,可以很方便的求解:

1. 设当前已求出的最长上升子序列的长度为len(初始时为1),每次读入一个新元素x:

2. 若x>d[len],则直接加入到d的末尾,且len++;(利用性质2)

否则,在d中二分查找,找到第一个比x小的数d[k],并d[k+1]=x,在这里x<=d[k+1]一定成立(性质1,2)。

/**

.最长递增子序列O(nlogn)算法:

.状态转移方程:f[i] = max{f[i],f[j]+1},1<=j

.分析:加入x=f[y],则x相对于y更有潜力。

.首先根据f[]值分类,记录满足f[t]=k的最小的值a[t],记d[k]=min{a[t]},f[t]=k.

. 1.发现d[k]在计算过程中单调不上升

. 2.d[1]

.解法:

.1. 设当前最长递增子序列为len,考虑元素a[i];

.2. 若d[len]

. 否则,在d[0-len]中二分查找,找到第一个比它小的元素d[k],并d[k+1]=a[i].()

.*/

/**

* Created by guojun on 2015/9/25.

*/

public class MaxUpSequence {

public static void main(String[] args) {

int[] a = new int[20];

for (int i = 0; i < a.length; i++) {

a[i] = (int)( Math.random() * 100);

System.out.print(a[i] + "\t");

}

System.out.println();

int[] b = new int[a.length];

b[0] = a[0];

int len = findSeq(a, b);

System.out.println(len);

}

public static int BinarySerch(int key, int[] a, int low, int high) {

while (low <= high) {

int mid = low + (high - low) / 2;

if (key > a[mid] && key < a[mid + 1]) {

return mid+1;

} else if (key > a[mid]) {

low = mid + 1;

} else if (key < a[mid]) {

high = mid - 1;

}

}

return 0;

}

public static int findSeq(int[] a, int[] b) {

if (a.length == 1) return 1;

int len = 1;

for (int i = 1; i < a.length; i++) {

if (a[i] > b[len - 1]) {

b[len] = a[i];

len++;

} else if (a[i] < b[len - 1]) {

int j = BinarySerch(a[i], b, 0, len - 1);

b[j] = a[i];

}

}

return len;

}

}

最长上升子序列 java_最长上升子序列 O(nlogn)解法 (java)相关推荐

  1. 数组的最长递减子序列java_最长递增/递减子序列

    <编程之美>里有个题目是要求数组中最长递增子序列,在CSDN上看到的题目是数组中的最长递减子序列.题目如下: 求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子 ...

  2. 最长递增子序列 java_最长递增子序列问题---动态规划

    最长递增子序列问题是一个很基本.较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法.由于这个问题能运用学过的基本的算法分析和设计的方法与思想,能 ...

  3. 字典序最大子序列java_字典序最大的子序列

    链接:https://www.nowcoder.com/acm/contest/84/A 来源:牛客网 题目描述 给定字符串s,s只包含小写字母,请求出字典序最大的子序列. 子序列:https://e ...

  4. 输出最长单调递增子序列java_动态规划实现最长单调递增子序列

    1. 实验环境 操作系统:Mac 64 运行内存:16GB 编程语言:Java 编译环境:Eclipse 2. 题目要求 设计一个Ο(nlgn)时间的算法,求一个 n 个数的序列的最长单调递增子序列. ...

  5. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  6. 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列

    唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...

  7. 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

    最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...

  8. 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用

    2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...

  9. Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离

    Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...

最新文章

  1. 让jquery easyui datagrid列支持绑定嵌套对象
  2. 信息系统开发平台OpenExpressApp - 数据权限
  3. python模块详解 time与date time
  4. ajax提交数据被截断的问题
  5. for ihs linux_Install WAS6.1+IHS for Linux(64bit)
  6. 笨办法学 Python · 续 练习 34:分析器
  7. Tomcat学习总结(17)—— Tomcat生产环境中域名访问和连接MySQL
  8. GitLab地域封锁,总监愤而辞职!苹果产品路线图曝光;CAT 0.1.0发布|极客头条...
  9. vue的table组件
  10. 电脑指定区域旋转_随州平板电脑无线管道潜望镜QV厂家_武汉天仪仪器
  11. 02 Python元组 字典 数据类型 if while for 迭代
  12. 在ubuntu 20.04 上 安装 onnxruntime CUDA
  13. 使用 tf.nn.dynamic_rnn 展开时间维度
  14. Windows Server 2016-Powershell之客户端加域
  15. 在线CAD看图网页版,一样可以快速查看CAD图纸
  16. 微信开放平台应用绑定
  17. JS实现文本的语音朗读
  18. java小游戏------Flappy Bird(飞翔的小鸟含源码)
  19. Cookie命名的由来
  20. “GANs”与“ODEs”:数学建模的终结?

热门文章

  1. 算术类型转换、整型提升
  2. c语言笔记:转义字符
  3. mq幂等mysql_膜拜!看完这篇你还不懂RocketMQ算我输
  4. python 不确定度_python机器学习-chapter2_16
  5. Spring MVC:The request sent by the client was syntactically incorrect
  6. python代做在哪找靠谱_比较靠谱的资产评估师考试去哪找
  7. java串口监听超时_从串口读取时如何实现read()的超时(C / C)
  8. 安装sqlserver2008,重新启动计算机不通过的解决办法
  9. numpy读取csv_Numpy——IO操作与数据处理
  10. arcgis中字段计算器利用python比较大小