所谓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初级推算(最长上升子序列问题)的更多相关文章

  1. 【线型DP模板】最上上升子序列(LIS),最长公共子序列(LCS),最长公共上升子序列(LCIS)

    BEGIN LIS: 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序 ...

  2. LIS 51Nod 1134 最长递增子序列

    给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10.   Input 第1行:1个 ...

  3. hdu 4352 XHXJ's LIS 数位DP+最长上升子序列

    题目描述 #define xhxj (Xin Hang senior sister(学姐))If you do not know xhxj, then carefully reading the en ...

  4. POJ 3903 Stock Exchange (E - LIS 最长上升子序列)

    POJ 3903    Stock Exchange  (E - LIS 最长上升子序列) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action ...

  5. 对最长公共子序列(LCS)等一系列DP问题的研究

    LIS问题: 设\(f[i]\)为以\(a[i]\)结尾的最长上升子序列长度,有: \[f[i]=f[j]+1(j<i&&a[j]<a[i])\] 可以用树状数组优化至\( ...

  6. 最长上升子序列算法(n^2 及 nlogn) (LIS) POJ2533Longest Ordered Subsequence

    问题描述: 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列 ...

  7. LIS最长上升子序列O(n^2)与O(nlogn)的算法

    动态规划 最长上升子序列问题(LIS).给定n个整数,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除0个或多个数,其他数的顺序不变).例如序列1, 6, 2, 3, 7, ...

  8. 最长公共子序列(LCS)和最长递增子序列(LIS)的求解

    一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...

  9. 04_最长上升子序列问题(LIS)

    来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题6: 问题描述:给定n个整数a1,a2,...,an,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除 ...

随机推荐

  1. 《Java从入门到失业》第四章:类和对象(4.3):一个完整的例子带你深入类和对象

    4.3一个完整的例子带你深入类和对象 到此为止,我们基本掌握了类和对象的基础知识,并且还学会了String类的基本使用,下面我想用一个实际的小例子,逐步来讨论类和对象的一些其他知识点. 4.3.1需求 ...

  2. Maven学习总结:几个常用的maven插件

    我们使用maven做一些日常的工作开发的时候,无非是想利用这个工具带来的一些便利.比如它带来的依赖管理,方便我们打包和部署运行.这里几个常见的插件就是和这些工程中常用的步骤相关. maven-comp ...

  3. 【Processing-日常3】等待动画1

    之前在CSDN上发表过: https://blog.csdn.net/fddxsyf123/article/details/79755976

  4. 数据结构 - 堆(Heap)

    数据结构 - 堆(Heap) 1.堆的定义 堆的形式满足完全二叉树的定义: 若 i < ceil(n/2) ,则节点i为分支节点,否则为叶子节点 叶子节点只可能在最大的两层出现,而最大层次上的叶 ...

  5. CentOS7 【linux系统】配置 JDK 教程

    1. 下载 [linux版本] JDK 1.8 的包. 2. 导入linux系统里面. 如何导入,下载一个winSCP 软件 破解安装,然后再linux 系统里面 查询IP,连接即可. 在linux解 ...

  6. Go-变量-var

    什么是变量? 一种抽象,计算机用来保存现实数据的容器,通过这个变量抽象可以写入现实数据到计算机中,并且可以读取变量取到保存到计算机中的现实数字化数据 Go-变量定义 关键字 var 关键符号 := i ...

  7. RT Thread的SPI设备驱动框架的使用以及内部机制分析

    注释:这是19年初的博客,写得很一般,理解不到位也不全面.19年末得空时又重新看了RTThread的SPI和GPIO,这次理解得比较深刻.有时间时再整理上传. -------------------- ...

  8. Asp.Net Core 企业微信静默授权

    企业微信接口文档 1.构造授权网页链接 2.回调获取到 Code 通过code+access_token去请求用户信息 3.获取access_token 调试准备工作 -->内网穿透+域名 推荐 ...

  9. 我把这个贼好用的Excel导出工具开源了!!

    写在前面 不管是传统软件企业还是互联网企业,不管是管理软件还是面向C端的互联网应用.都不可避免的会涉及到报表操作,而对于报表业务来说,一个很重要的功能就是将数据导出到Excel.如果我们在业务代码中, ...

  10. java高级项目 jdbc与数据库连接数据库

    //图书管类 public class Book { private Integer id; private String b_name; private double b_price; privat ...