算法实践--最长递增子序列(Longest Increasing Subsquence)
什么是最长递增子序列(Longest Increasing Subsquence)
对于一个序列{3, 2, 6, 4, 5, 1},它包含很多递增子序列{3, 6}, {2,6}, {2, 4, 5}, {1}
其中最长的递增子序列是{2, 4, 5}
问题:对于长度为N的矢量D,如何找到它的最长递增子序列
一个简单的算法
for (i=N; i>0; --i) {. 找到所有长度为i的子序列; //复杂度为(N!)/(i!)(N-i)! O(exp(N))
. 判断是否其中有一个为递增子序列
}
动态规划算法
基本思想:将一个复杂问题,分解为更小的子问题
首先定义LIS[i],表示以D[i]结尾的最长子序列
对于矢量D = {, , , , , };
LIS[]:
LIS[]:
LIS[]: ,
LIS[]: ,
LIS[]: ,,
LIS[]:
给出递推公式
LIS[0] = D[0]
LIS[i] = MAX(LIS[j] | j <i, D[j] <D[i]) + "D[i]"
解释:
当我们求LIS[i]时,对于任意j<i,LIS[j]都已知
在所有已知的LIS中,找出结尾的元素值小于D[i],长度最长的一个
然后在后面加上D[i]元素,即为LIS[i]
示例C++代码
using namespace std;
void prt(vector<int>& arr, string msg = "") {
cout << msg << " ";
for (auto i: arr) {
cout << i << " ";
}
cout << endl;
}
void calc_LIS(vector<int>& D) {
vector< vector<int> > L(D.size()); // The longest increasing subsequence ends with D[i]
L[].push_back(D[]);
for (int i=; i<D.size(); i++) {
for(int j=; j<i; j++) {
if ( (D[j] < D[i]) && ( L[i].size() < L[j].size() ) ) {
L[i] = L[j];
}
}
L[i].push_back(D[i]);
}
for (auto x: L) {
prt(x);
}
}
int main() {
int a[] = {, , , , , };
vector<int> arr(a, a + sizeof(a)/sizeof(a[]));
prt(arr, "Data In:");
calc_LIS(arr);
return ;
}
复杂度分析
时间复杂度是O(N^2)
动态规范的基本思想是以一定的空间开销,显著缩短时间开销
算法实践--最长递增子序列(Longest Increasing Subsquence)的更多相关文章
- 算法实践--最长公共子序列(Longest Common Subsquence)
什么是最长公共子序列 X=ACCG Y=CCAGCA 长度为1的公共子序列: {A} {C} {G} 长度为2的公共子序列:{AC} {CC} {CG} {AG} 长度为3的公共子序列:{ACG} 长 ...
- 最长递增子序列(Longest increasing subsequence)
问题定义: 给定一个长度为N的数组A,找出一个最长的单调递增子序列(不要求连续). 这道题共3种解法. 1. 动态规划 动态规划的核心是状态的定义和状态转移方程.定义lis(i),表示前i个数中以A[ ...
- 【转】动态规划:最长递增子序列Longest Increasing Subsequence
转自:https://www.cnblogs.com/coffy/p/5878915.html 设f(i)表示L中以ai为末元素的最长递增子序列的长度.则有如下的递推方程: 这个递推方程的意思是,在求 ...
- 最长递增子序列(Longest Increase Subsequence)
问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱).例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8 ...
- 300最长上升子序列 · Longest Increasing Subsequence
[抄题]: 往上走台阶 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的. 样例 给出 [5,4,1,2,3],LIS 是 [1,2 ...
- [Swift]LeetCode300. 最长上升子序列 | Longest Increasing Subsequence
Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Inp ...
- [Swift]LeetCode329. 矩阵中的最长递增路径 | Longest Increasing Path in a Matrix
Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...
- nlog(n)解动态规划--最长上升子序列(Longest increasing subsequence)
最长上升子序列LIS问题属于动态规划的初级问题,用纯动态规划的方法来求解的时间复杂度是O(n^2).但是如果加上二叉搜索的方法,那么时间复杂度可以降到nlog(n). 具体分析参考:http://b ...
- 动态规划--最长上升子序列(Longest increasing subsequence)
前面写了最长公共子序列的问题.然后再加上自身对动态规划的理解,真到简单的DP问题很快就解决了.其实只要理解了动态规划的本质,那么再有针对性的去做这方的题目,思路很快就会有了.不错不错~加油 题目描述: ...
随机推荐
- 『TensorFlow』TFR数据预处理探究以及框架搭建
一.TFRecord文件书写效率对比(单线程和多线程对比) 1.准备工作 # Author : Hellcat # Time : 18-1-15 ''' import os os.environ[&q ...
- 配置Beyond Compare作为比较和合并工具
配置方法 建议配置在~/.gitconfig中. Linux下 [diff] tool = bc3[difftool] prompt = false[merge] tool = bc ...
- 正常终止expdp作业
1.先查询expdp对应的job_nameSQL> select * from dba_datapump_jobs; OWNER_NAME JOB_NAME OPERATION JOB_MOD ...
- Android代码安全工具集
前言 原计划出一系列APP测试文章,从基础发,整个思路还在整理,秉着吹牛的态度,整理了一部分安卓代码安全的工具推荐给大家玩玩,提升一下逼格. 在这之前给大家讲讲阿旺对安全测试的理解,不管别人怎么扯,一 ...
- ID基本操作(在框架内处理文本)5.28
1.可以直接拖入文档,word,excel,rtf,还可以选中文字,导出文本. 2. 批量把一段文字改为另一段. 还可以改特殊符号.定义范围 . 建立文字后鼠标右键,选择文本框架选项 直接拖动文本框架 ...
- 一直又爱又恨的jqueryValidate,看到一个还不错的laber.error样式
默认样式,不是很好看 修改之后就高大上多了 功臣如下: label.error { position: absolute; right: 18px; top: 5px; colo ...
- K2助力大鹏绿色环保之路
K2和大鹏结缘可以追溯到2006年,两家践行绿色环保理念的公司一拍即合,开始了十余年的合作之路,在“绿色环保”的路上留下了坚实的脚印. 绿色能源:LNG 广东大鹏液化天然气有限公司成立于2004年 ...
- 二十五. Python基础(25)--模块和包
二十五. Python基础(25)--模块和包 ● 知识框架 ● 模块的属性__name__ # my_module.py def fun1(): print("Hello& ...
- python基础——字典
字典内置函数&方法 Python字典包含了以下内置函数: 序号 函数及描述 1 cmp(dict1, dict2)比较两个字典元素. 2 len(dict)计算字典元素个数,即键的总数. 3 ...
- [ZJOI2007]最大半联通子图
这个题,翻译一下题面,就是一个连通图,找他的最长链的数量... 所以说方法就比较明显了:tarjan缩点+拓扑+DP 注意也是本题唯一坑点,拓扑DP的时候要考虑重复边的情况... 呆码: #inclu ...