LIS初级推算(最长上升子序列问题)
所谓LIS,就是Longest Increasing Subsequence问题
注意,子序列不一定是连续的,举个例子:对于序列10,9,2,3,5,4,7,9,101,18,其中的LIS就是2,3,5,7,9,18(或者2,3,5,7,9,101)
那么就出现另一个要注意的地方了:LIS自身不一定只有一个,但是LIS.length()一定是固定的(很容易反证对吧)
【鉴于我是第一次研究LIS,所以自己分析出来的dp可能会很水不高级orz】
那不如我们就从上面那个例子开始吧~
vector<int> nums = {10,9,2,3,5,4,7,9,101,18}
初始:dp[0] = 1 因为就只有它自己,同时我们指定所返回的数如果其前面没有比他更小的就返回自己的位置
第i个数 | nums[i] |
上一个比nums[i]小的数的位置 |
dp[i] | 序列 |
0 | 10 | 0 | 1 | 10 |
1 | 9 | 1 | 1 | 9 |
2 | 2 | 2 | 1 | 2 |
3 | 3 | 2 | 2 | 2,3 |
4 | 5 | 3 | 3 | 2,3,5 |
5 | 4 | 2 | 3 | 2,3,4 |
6 | 7 | 4 | 4 | 2,3,5,7 |
7 | 9 | 6 | 5 | 2,3,5,7,9 |
8 | 101 | 7 | 6 | 2,3,5,7,9,101 |
9 | 18 | 7 | 6 | 2,3,5,7,9,18 |
注意:根据“贪心”的我们的需求,我们在寻找上一个比nums[i]小的数的位置时保证所找到的dp对应数字最大
那么我们就需要一个函数,返回上一个比nums[i]小的数的位置
1 vector<int> dp(10001,0);
2 int find_last_less_place(int now,vector<int>& nums,int pos)
3 {
4 int max_dp_place = pos;
5 for (int i = pos - 1; i >= 0; i--)
6 {
7 if(nums[i] < now)
8 {
9 if(dp[i] > dp[max_dp_place])
10 max_dp_place = i;
11 }
12 }
13 return max_dp_place;
14 }
然后我们就可以进行总的处理啦
1 //最长上升子序列
2 int lengthOfLIS(vector<int>& nums)
3 {
4 if (nums.size() == 0)
5 return 0;
6 if (nums.size() == 1)
7 return 1;
8
9 int MAX = -1;
10 dp[0] = 1;
11
12 cout << "last = NaN" << " now_place = 0" << " now is = " << nums[0] << " dp[i] = " << 1 << endl;
13 for (int i = 1; i < nums.size(); ++i)
14 {
15 int last_place = find_last_less_place(nums[i],nums,i);
16 cout << "last = " << last_place << " now_place = " << i << " now is = " << nums[i] << " ";
17 if(last_place == i)
18 dp[i] = 1;
19 else
20 dp[i] = dp[last_place] + 1;
21 cout << "dp[i] = " << dp[i] << endl;
22 MAX = max(MAX,dp[i]);
23 }
24 return MAX;
25 }
现在的问题就是这个算法的复杂度为O(n^2),下一次更新就是我学成O(nlogn)之时~顺便还有LICS,LCS等问题
LIS初级推算(最长上升子序列问题)的更多相关文章
- 【线型DP模板】最上上升子序列(LIS),最长公共子序列(LCS),最长公共上升子序列(LCIS)
BEGIN LIS: 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序 ...
- LIS 51Nod 1134 最长递增子序列
给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10. Input 第1行:1个 ...
- hdu 4352 XHXJ's LIS 数位DP+最长上升子序列
题目描述 #define xhxj (Xin Hang senior sister(学姐))If you do not know xhxj, then carefully reading the en ...
- POJ 3903 Stock Exchange (E - LIS 最长上升子序列)
POJ 3903 Stock Exchange (E - LIS 最长上升子序列) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 对最长公共子序列(LCS)等一系列DP问题的研究
LIS问题: 设\(f[i]\)为以\(a[i]\)结尾的最长上升子序列长度,有: \[f[i]=f[j]+1(j<i&&a[j]<a[i])\] 可以用树状数组优化至\( ...
- 最长上升子序列算法(n^2 及 nlogn) (LIS) POJ2533Longest Ordered Subsequence
问题描述: 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列 ...
- LIS最长上升子序列O(n^2)与O(nlogn)的算法
动态规划 最长上升子序列问题(LIS).给定n个整数,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除0个或多个数,其他数的顺序不变).例如序列1, 6, 2, 3, 7, ...
- 最长公共子序列(LCS)和最长递增子序列(LIS)的求解
一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...
- 04_最长上升子序列问题(LIS)
来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题6: 问题描述:给定n个整数a1,a2,...,an,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除 ...
随机推荐
- 线程的阻塞 sleep() wait() yield()
为了解决对共享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对共享资源的访问,显然同步机制已经不够了,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了 ...
- 天猫精灵对接1:outh对接
公司的智能家居产品需要接入语音控制,目前在对接阿里语音的天猫精灵 对接天猫精灵的第一步是完成outh鉴权 https://doc-bot.tmall.com/docs/doc.htm?spm=0.76 ...
- 深入理解java虚拟机--垃圾收集器
对象的销毁 对象的finalize方法只会执行一次,在finalize里可以自救不被销毁,二次被主动gc,必定会销毁 类销毁
- 爬虫必看,每日JS逆向之爱奇艺密码加密,今天你练了吗?
友情提示:优先在公众号更新,在博客园更新较慢,有兴趣的关注一下知识图谱与大数据公众号,本次目标是抠出爱奇艺passwd加密JS代码,如果你看到了这一篇,说明你对JS逆向感兴趣,如果是初学者,那不妨再看 ...
- 【JAVA】JAVA相关知识点收集
下面这些链接都是我这段时间(7月-9月)看过的.感觉自己现在处于一个疯狂吸收知识的阶段,如果是文字的方式一点一点搬运到自己的博客既重复又费时间,只有等自己积累到一定程度后才能进行原创性高质量的产出吧. ...
- Jboss未授权访问漏洞复现
一.前言 漏洞原因:在低版本中,默认可以访问Jboss web控制台(http://127.0.0.1:8080/jmx-console),无需用户名和密码. 二.环境配置 使用docker搭建环境 ...
- myisamchk是用来做什么的?MyISAM Static和MyISAM Dynamic有什么区别?
myisamchk是用来做什么的? 它用来压缩MyISAM[歌1] 表,这减少了磁盘或内存使用. MyISAM Static和MyISAM Dynamic有什么区别? 在MyISAM Static上的 ...
- Linux下安装ZooKeeper-3.5.6
下载 官网下载地址是https://www.apache.org/dyn/closer.cgi/zookeeper,下载apache-zookeeper-3.5.6-bin.tar.gz. sta ...
- 记录从Winserver2012R2升级到Winserver2019
升级系统是必不可少的,最近想搞虚拟化Hyper-V:于是着手需要装一台WIN server 2019. 手头有一台Winserver 2012R2,正好拿来测试升级,此博做一个记录. 操作流程:在升级 ...
- 【题解】【HAOI2011】Problem b
\(Luogu2522\) 题目大意:求下面式子的值: \[\sum_{i=x}^n\sum_{j=y}^m[\gcd(i,j)=k] \] 这个东西直接求不好求,考虑差分,从\([1,n]\)的范围 ...