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,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除 ...
随机推荐
- git线上操作
选择线上仓库 """ 1.注册码云账号并登录:https://gitee.com/ 2.创建仓库(课堂截图) 3.本地与服务器仓库建立连接 ""&qu ...
- Windows10上安装MySQL(详细)
一.下载MySQL 1.在浏览器里打开mysql的官网http://www.mysql.com 2.进入页面顶部的"Downloads" 3.下滑页面,打开页面底部的"C ...
- spring in action-note-2
1.AOP:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是 ...
- 2020 巅峰极客 WP_ Re
第一题:virus 是一个win32 的题,没给加壳. 主函数: int __cdecl main(int argc, const char **argv, const char **envp) { ...
- 超详细的 Vagrant 上手指南
搭建 Linux 虚拟机,别再用 VirtualBox 从 .iso 文件安装了. 概述 2020 年了,也许你已经习惯了 docker,习惯了在 XX 云上快速创建云主机,但是如果你想在个人电脑上安 ...
- Python-序列-str list tuple
序列 有序数列 str tupe list str tupe 不可变 list 可变 序列(str list tuple) 每个元素都会有个序号(0开始计数) 1. 知索引取单个确定类型 [index ...
- Python练习题 030:Project Euler 002:偶数斐波那契数之和
本题来自 Project Euler 第2题:https://projecteuler.net/problem=2 # Each new term in the Fibonacci sequence ...
- 一篇文章带你了解Java OOP思想
Java OOP 思想深度刨析 Java面向对象编程 面向对象编程简称OOP(Object--对象.Oriendted--导向的.Programming--程序设计) 面向对象通俗来讲,就是指使用丰富 ...
- linux 漏洞列表
#CVE #Description #Kernels CVE-2017-1000367 [Sudo](Sudo 1.8.6p7 - 1.8.20) CVE-2017-7494 [Samba Remot ...
- git-代码分支管理
1. git代码分支管理 DEV SIT UAT PET PRE PRD PROD常见环境英文缩写含义 英文缩写 英文 中文 DEV development 开发 SIT System Int ...