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,黑人问号??? 这题可以用线段树 ...
随机推荐
- NOJ——1559Jump to the Top of Mountain(简单暴力DFS+渣渣代码)
[1559] Jump to the Top of Mountain 时间限制: 1000 ms 内存限制: 65535 K 问题描述 Have you played a game named Min ...
- HDU——1009FatMouse' Trade(贪心+结构体+排序)
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- [图论训练]BZOJ 2118: 墨墨的等式 【最短路】
Description 墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在 ...
- 刷题总结——稻草人(bzoj4237cdq分治)
题目: Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样, ...
- 升级springboot 2.x 踩过的坑——跨域导致session问题
目前IT界主流前后端分离,但是在分离过程中一定会存在跨域的问题. 什么是跨域? 是指浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域. 做过web后台的童鞋都知道,跨 ...
- Nginx报504 gateway timeout错误的解决方法
转载文章来源:http://www.111cn.net/sys/nginx/90669.htm(若侵删) Nginx报504 gateway timeout错误引起,一个是文件配置问题,另一个是相关处 ...
- Quotes in shell(bash, csh)
There are three kinds of quote: single quote('), double quote("), backslash(\), how shell expla ...
- Laravel 基础知识
使用版本Laravel5.1.======================================================目录简单介绍:app目录,核心目录,应用目录.bootstra ...
- AC日记——Pupils Redistribution Codeforces 779a
A. Pupils Redistribution time limit per test 1 second memory limit per test 256 megabytes input stan ...
- awk理论详解、实战
答疑解惑: 为什么用awk取IP的时候用$4? ifconfig eth0 | awk -F '[ :]+' 'NR==2{print $4}' IP第二行内容如下: inet addr:10.0.0 ...