最长递增子序列和双序列
- 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。
- 从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。
1、思路:
定义L(i):以ai为最后一个元素的最长子序列的长度。当i=1或ai<min{a1,a2,...,a(i-1)}时,L(i)=1; 当1≤j≤i-1且aj<ai时,L(i)=max{L(j)}+1。时间复杂度O(n2)。
1 #include <iostream> 2 using namespace std; 3 #define len(a) (sizeof(a) / sizeof(a[0])) //数组长度 4 int lis(int arr[], int len) 5 { 6 int longest[len]; 7 for (int i=0; i<len; i++) 8 longest[i] = 1; 9 10 for (int j=1; j<len; j++) { 11 for (int i=0; i<j; i++) { 12 if (arr[j]>arr[i] && longest[j]<longest[i]+1){ //注意longest[j]<longest[i]+1这个条件,不能省略。 13 longest[j] = longest[i] + 1; //计算以arr[j]结尾的序列的最长递增子序列长度 14 } 15 } 16 } 17 18 int max = 0; 19 for (int j=0; j<len; j++) { 20 cout << "longest[" << j << "]=" << longest[j] << endl; 21 if (longest[j] > max) max = longest[j]; //从longest[j]中找出最大值 22 } 23 return max; 24 } 25 26 int main() 27 { 28 int arr[] = {1, 4, 5, 6, 2, 3, 8}; //测试数组 29 int ret = lis(arr, len(arr)); 30 cout << "max increment substring len=" << ret << endl; 31 return 0; 32 }
或者定义:B[i]来标记长度为i的增序列的最小数字是多少,遍历原数组对每一个数字插入到B[i]中的合适位置,并记录当前最长len。时间复杂度O(nlogn)。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define N 9 //数组元素个数 6 int array[N] = {2, 1, 6, 3, 5, 4, 8, 7, 9}; //原数组 7 int B[N]; //在动态规划中使用的数组,用于记录中间结果,其含义三言两语说不清,请参见博文的解释 8 int len; //用于标示B数组中的元素个数 9 10 int LIS(int *array, int n); //计算最长递增子序列的长度,计算B数组的元素,array[]循环完一遍后,B的长度len即为所求 11 int BiSearch(int *b, int len, int w); //做了修改的二分搜索算法 12 13 int main() 14 { 15 printf("LIS: %d\n", LIS(array, N)); 16 17 int i; 18 for(i=0; i<len; ++i) 19 { 20 printf("B[%d]=%d\n", i, B[i]); 21 } 22 23 return 0; 24 } 25 26 int LIS(int *array, int n) 27 { 28 len = 1; 29 B[0] = array[0]; 30 int i, pos = 0; 31 32 for(i=1; i<n; ++i) 33 { 34 if(array[i] > B[len-1]) //如果大于B中最大的元素,则直接插入到B数组末尾 35 { 36 B[len] = array[i]; 37 ++len; 38 } 39 else 40 { 41 pos = BiSearch(B, len, array[i]); //二分查找需要插入的位置 42 B[pos] = array[i]; 43 } 44 } 45 46 return len; 47 } 48 49 //修改的二分查找算法,返回数组元素需要插入的位置。 50 int BiSearch(int *b, int len, int w) 51 { 52 int left = 0, right = len - 1; 53 int mid; 54 while (left <= right) 55 { 56 mid = left + (right-left)/2; 57 if (b[mid] > w) 58 right = mid - 1; 59 else if (b[mid] < w) 60 left = mid + 1; 61 else //找到了该元素,则直接返回 62 return mid; 63 } 64 return left;//数组b中不存在该元素,则返回该元素应该插入的位置 65 }
转载于:https://www.cnblogs.com/wangpengjie/archive/2013/03/24/2978208.html
最长递增子序列和双序列相关推荐
- Python---查找序列的最长递增子序列
查找序列的最长递增子序列 什么是序列的最长递增子序列? 答:在一个数值序列中,找到一个子序列,使得这个子序列元素的数值依次递增,并且这个子序列的长度尽可能地大.这就是所谓的最长递增子序列 from i ...
- 最长递增子序列 最长连续递增序列
引言 这两道题有很大的相似性,在这里主要的地方就是循环的设置,不仅仅适用于这两道题,在很多类似的题目中都可以用到,要学会相应的方法才行: 最长递增子序列 给你一个整数数组 nums ,找到其中最长严格 ...
- 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹
一, 最长递增子序列问题的描述 设L=<a1,a2,-,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,-,akm>,其中k1< ...
- 代码随想录训练营day52, 最长递增子序列, 最长连续递增序列, 最长重复子数组
最长递增子序列 dp[i]的定义, 表示i之前包括i的以nums[i]结尾最长上升子序列的长度 递推: if(nums[i] > nums[j]) dp[i] = max(dp[i], dp[j ...
- 最长递增子序列和网易去除最少使从左向右递增又递减问题
(1)最长递增子序列问题 有两种方法:(1)动态规划方法(2)类似二分查找的方法O(nlogn) 动态规划方法: 以i结尾的序列的最长递增子序列和其[0, i - 1]"前缀"的最 ...
- 最长递增子序列问题的求解
一, 最长递增子序列问题的描述 设L=<a1,a2,-,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,-,akm>,其中k1<k2 ...
- 编程之美2.16 最长递增子序列
这道题目要求返回一个数字,这个数字代表一个数组中最长的递增子序列,当然,不要求这个序列是连续的,比如,有这样一个数组:{1, 3,5,7, 2, 9},那么这个数组的最长递增子序列就是5, ...
- 洛谷P2766-最长递增子序列问题
chunlvxiong的博客 题目描述: 给定正整数序列x1,...,xn (1≤n≤500). 1.计算其最长递增子序列的长度s. 2.计算从给定的序列中最多可取出多少个长度为s的递增子序列. 3. ...
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...
- Java输出数组中最长递增子序列的代码
下面内容是关于Java输出数组中最长递增子序列的内容,希望对大伙有较大用途. package com.wzs;import java.util.ArrayList; import java.util. ...
最新文章
- Mybatis的工作原理,你了解过吗?
- ME | 决定性过程促进了深层土壤微生物空间周转率的增加
- Vue creatElement
- html类型转换函数,如何在JavaScript中转换数据类型?
- c++ io条件状态 的一个例子
- Mongoose 中使用 populate 实现关联查询
- 视觉中国、IC photo被责令暂停服务全面整改
- linux 摄像头设置时间同步,linux系统设置时间同步
- 2018-2019 ACM-ICPC, Asia Jiaozuo Regional Contest题解
- 位CPU和64位CPU 区别
- 线程同步与互斥:POSIX无名信号量
- vc如何画圆,并填充颜色
- C++实现设计模式——Builder模式
- IDEA jsp页面代码没有高亮
- 激荡三十年——互联网的崛起
- 室内三维物体识别与姿态估计--背景
- 2021-05-11 MongoDB面试题 MongoDB中的命名空间是什么意思
- 金融IT的“困”与“道”
- 应聘者面试的收获-说说工作的正确姿势(20170108)
- 分享几张个人在使用的alienware的壁纸
热门文章
- Docker网络一览
- jQuery中animate()的方法以及$(body).animate({scrollTop:top})不被Firefox支持问题的解决...
- [转]vs2003,安装程序检测到另一个程序要求计算机重新启动
- Web页面输出Excel的数字问题解决方法
- 怎么去掉字符串最后一个逗号
- Codeforce842D Vitya and Strange Lesson
- linux虚拟机ping通主机
- python 读取excel表格的数据
- Spring学习笔记(四)
- github git clone ssh协议 clone超慢解决方案,提高Github Clone速度