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,黑人问号??? 这题可以用线段树 ...
随机推荐
- HDU——1420Prepared for New Acmer(快速幂取模)
Prepared for New Acmer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- BZOJ3209 花神的数论题 【组合数 + 按位计数】
题目 背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC -- 当然也包括 CH 啦. 描述 话说花神这天又来讲课了.课后照例有超级难的神题啦-- 我等蒟蒻又遭殃了. 花神的题目 ...
- vue 按需加载
vue 构建单页面应用,但是问题是随着系统的体积变大,js文件也体积太大了,这时候就需要按需要进行加载了 vue-router提供了懒加载的方式 const Foo = resolve => r ...
- TSP 旅行商问题(状态压缩dp)
题意:有n个城市,有p条单向路径,连通n个城市,旅行商从0城市开始旅行,那么旅行完所有城市再次回到城市0至少需要旅行多长的路程. 思路:n较小的情况下可以使用状态压缩dp,设集合S代表还未经过的城市的 ...
- .NET Core 微服务之Polly重试策略
接着上一篇说,正好也是最近项目里用到了,正好拿过来整理一下,园子里也有一些文章介绍比我详细. 简单介绍一下绍轻量的故障处理库 Polly Polly是一个.NET弹性和瞬态故障处理库 允许我们以非常 ...
- 【BZOJ3529】数表(莫比乌斯反演,BIT,自然溢出)
题意: 思路: #include<cstdio> #include<cstring> #include<string> #include<cmath> ...
- BZOJ 4077 Messenger
Messenger [问题描述] alice和bob各自在两条折线上行进,一个邮递员要从alice那拿一个包裹,并以直线移动到bob处,alice和bob.邮递员的速度均为1单位/s,问邮递员最少要走 ...
- 【Dll】Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call
[问题说明]调试动态库导出的函数时遇到的问题 [解决方法]要么加上__stdcall,对应__stdcall:要么去掉__stdcall,对应_cdecl
- 【Visual Studio】error C2220: 警告被视为错误 - 没有生成“object”文件 (转)
原文转自 http://www.cnblogs.com/kex1n/archive/2011/10/19/2217266.html [错误原因] 该文件的代码页为英文,而我们系统中的代码页为中文. [ ...
- hdu 5444(构造二叉树然后遍历)
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...