算法实践--最长递增子序列(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问题很快就解决了.其实只要理解了动态规划的本质,那么再有针对性的去做这方的题目,思路很快就会有了.不错不错~加油 题目描述: ...
随机推荐
- BFS GPLT L2-016 愿天下有情人都是失散多年的兄妹
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216 分析:一开始以为是并查集..... ...
- jQuery操作iframe中js函数的方法小结
1.jquery操作iframe中的元素(2种方式) ? 1 2 var tha = $(window.frames["core_content"].document).find( ...
- easyui datebox时间控件如何只显示年月
easyui datebox控件,只显示年月,不显示年月日 需要的效果图如下: 具体的js代码: <script> $(function(){ intiMonthBox('costTime ...
- 命令行听歌http://www.linuxsir.org/bbs/thread280142.html?pageon=1#1584689
在纯字符界面下听歌 利用 play 命令可以在命令行中播放音频文件,在纯字符界面下也没问题! ----------------------------------------------------- ...
- day18_python_1124
01 鸡汤 荷花定律 山竹定律 金蝉定律 荷花定律: 明天比今天要生长多一倍,池塘三十天生长满,第29天是一半. 山竹定律: 竹子在生长时,前三年只出地表3厘米,从第四年开始,以每天30cm的速度开始 ...
- 学号 20175223 《Java程序设计》第4周学习总结
学号 20175223 <Java程序设计>第4周学习总结 教材学习内容总结 第五章要点: 要点1:子类与父类:extends.类的树形结构: 要点2:子类的继承性:同一包中与不在同一包中 ...
- Linux 查看端口被什么程序占用
lsof -i:8899 输出: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEjava 38889 root 329u IPv6 5883661 ...
- 【EMV L2】DDA标准动态数据认证处理流程
[标准动态数据认证DDA] 标准动态数据处理过程,除了动态签名由卡片生成以外,其他都是由终端执行的.处理过程: 1.认证中心公钥的获取终端使用认证中心公钥索引(PKI)以及卡片中的注册的应用提供商标识 ...
- flask自定义处理错误方法
自定义错误处理方法: 当客户端访问浏览器是,得到相对应的状态码,服务器通过状态码给用户相对应的页面. @app.errorhandler(404) def handle_404_error(err): ...
- linux下(Window当然也可以)解决idea创建maven项目导入过慢问题
1.正常创建maven web项目 2.见下图,选择加号 3.弹出的框中填入archetypeCatalog----internal,确定即可