longestIncreasingSequence最长上升子序列问题
package dp; /**
* 最长上升子序列问题
*/
public class LongestIncreasingSubsequence
{
/**
* 原始dp
* @param arr
* @return
*/
public static int maxLength(int[] arr)
{
int[] len = new int[arr.length] ; //以i为结尾的最长上升子序列
int[] mark = new int[arr.length] ;//标记以i为结尾的最长上升子序列的上一个节点所在的上上子序列位置
len[0] = 1 ;
mark[0] = -1 ; int maxPos = 0 ;
for(int i=1 ; i<len.length ; i++)
{
len[i] = 1 ;
mark[i] = -1 ;
for(int j=i-1 ; j>=0 ; j--)
{
if(arr[j] < arr[i] && (len[j]+1) > len[i])
{
len[i] = len[j]+1 ;
mark[i] = j ;
} }
if(len[maxPos] < len[i])
maxPos = i ;
} int maxP = maxPos ;
while (maxP != -1)
{
System.out.println(arr[maxP]);
maxP = mark[maxP] ;
}
return len[maxPos] ;
} /**
* 使用二分加速的dp
* @param arr
* @return
*/
public static int maxLength2(int[] arr)
{
int[] len = new int[arr.length] ; //以i为结尾的最长上升子序列
int[] mark = new int[arr.length] ;//标记以i为结尾的最长上升子序列的上一个节点所在的上上子序列位置
int[] m = new int[arr.length+1] ;//标记长度为x的子序列的最小值在arr中的位置 int mLength = 1 ;
len[0] = 1 ;
mark[0] = -1 ;
m[1] = 0 ; int maxPos = 0 ;
for(int i=1 ; i<len.length ; i++)
{
len[i] = 1 ;
mark[i] = -1 ; int pos = binarySearch(arr , m , mLength , arr[i]) ; if(pos != -1)
{
len[i] = len[pos]+1 ;
mark[i] = pos ;
} if(mLength < len[i])
{
m[len[i]] = i ;
mLength++ ;
}
else if(arr[m[len[i]]] > arr[i])
{
m[len[i]] = i ;
} if(len[maxPos] < len[i])
maxPos = i ;
} int maxP = maxPos ;
while (maxP != -1)
{
System.out.println(arr[maxP]);
maxP = mark[maxP] ;
}
return len[maxPos] ;
} /**
* 寻找arr中比k小的最大数
* @param n 表示m的长度
* @param m 表示标记长度为x的子序列的最小值的位置的数组
* @return 该元素在arr中的位置(为标记函数而服务的)
*/
private static int binarySearch(int[] arr , int[] m , int n , int k) {
int lo = 1;
int hi = n; while ((hi-lo) > 1)
{
int mid = lo + (hi-lo)/2 ; if(arr[m[mid]] < k)
lo = mid ;
else
hi = mid ;
} if(arr[m[hi]] < k)
return m[hi] ;
else if(arr[m[lo]] < k)
return m[lo] ;
else
return -1 ;
} public static void main(String[] args) {
int[] arr = new int[]{
// 1,4,8,3,4,5
// 3,5,1,7,5,9,3,5
1, 7, 3, 5, 9, 4, 1
} ; System.out.println(maxLength2(arr));
}
}
//http://blog.csdn.net/code_pang/article/details/8757380
//http://blog.csdn.net/chenwenshi/article/details/6027086
longestIncreasingSequence最长上升子序列问题的更多相关文章
- 用python实现最长公共子序列算法(找到所有最长公共子串)
软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- [Data Structure] LCSs——最长公共子序列和最长公共子串
1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- LintCode 77: 最长公共子序列
public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common s ...
- 最长下降子序列O(n^2)及O(n*log(n))解法
求最长下降子序列和LIS基本思路是完全一样的,都是很经典的DP题目. 问题大都类似于 有一个序列 a1,a2,a3...ak..an,求其最长下降子序列(或者求其最长不下降子序列)的长度. 以最长下降 ...
- 删除部分字符使其变成回文串问题——最长公共子序列(LCS)问题
先要搞明白:最长公共子串和最长公共子序列的区别. 最长公共子串(Longest Common Substirng):连续 最长公共子序列(Longest Common Subsequence,L ...
- [BZOJ3173][Tjoi2013]最长上升子序列
[BZOJ3173][Tjoi2013]最长上升子序列 试题描述 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上 ...
- 3173: [Tjoi2013]最长上升子序列
原题:http://www.lydsy.com/JudgeOnline/problem.php?id=3173 题解:促使我写这题的动力是,为什么百度遍地是Treap,黑人问号??? 这题可以用线段树 ...
随机推荐
- poj 1081 To The Max
To The Max Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- maven打包加入依赖包以及加入本地依赖包的方法
Maven引入本地Jar包并打包进War包中 1.概述 在平时的开发中,有一些Jar包因为种种原因,在Maven的中央仓库中没有收录,所以就要使用本地引入的方式加入进来. 2. 拷贝至项目根目录 项目 ...
- 转 PHP 使用 Redis
PHP 使用 Redis PHP 使用 Redis 安装 开始在 PHP 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 PHP redis 驱动,且你的机器上能正常使用 PHP ...
- grep用法详解:grep与正则表达式【转】
转自:http://blog.csdn.net/hellochenlian/article/details/34088179 grep用法详解:grep与正则表达式 首先要记住的是: 正则表达式与通配 ...
- AC日记——最优贸易 codevs 1173
题目描述 Description [问题描述]C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路 ...
- 小程序-初次进入小程序的授权问题(授权更新后的完整步骤)button主动授权
在此做个笔记 最开始小程序的开发时,信息授权的问题刚完善,后面腾讯就更新了新的授权方式,真心的感到心累. 后来的button,主动授权问题,时间一久就有些忘记了,最近在新开发一个小程序的拆红包活动,需 ...
- Codeforces Round #442 (Div. 2) Danil and a Part-time Job
http://codeforces.com/contest/877/problem/E 真的菜的不行,自己敲一个模板,到处都是问题.哎 #include <bits/stdc++.h> u ...
- 笔记-迎难而上之Java基础进阶4
内部类创建多线程 //匿名内部类创建多线程 public class InnerClassThread{ public static void main(String[] args){ //回忆一下之 ...
- JavaScript的变量:变量提升
JavaScript代码的运行规则 在JavaScript代码运行之前其实是有一个编译阶段的.编译之后才是从上到下,一行一行解释执行.这样一来也给初学者造成很大的误解.初学者会觉得JavaScript ...
- Maven自动部署war到Tomcat8
原文:http://www.cnblogs.com/yucongblog/p/5392932.html 我使用的环境是:Eclipse Java EE IDE for Web Developers(V ...