1. 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。
  2. 从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。

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)。

LIS

 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)。

BiSearchLIS

 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

最长递增子序列和双序列相关推荐

  1. Python---查找序列的最长递增子序列

    查找序列的最长递增子序列 什么是序列的最长递增子序列? 答:在一个数值序列中,找到一个子序列,使得这个子序列元素的数值依次递增,并且这个子序列的长度尽可能地大.这就是所谓的最长递增子序列 from i ...

  2. 最长递增子序列 最长连续递增序列

    引言 这两道题有很大的相似性,在这里主要的地方就是循环的设置,不仅仅适用于这两道题,在很多类似的题目中都可以用到,要学会相应的方法才行: 最长递增子序列 给你一个整数数组 nums ,找到其中最长严格 ...

  3. 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹

    一,    最长递增子序列问题的描述 设L=<a1,a2,-,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,-,akm>,其中k1< ...

  4. 代码随想录训练营day52, 最长递增子序列, 最长连续递增序列, 最长重复子数组

    最长递增子序列 dp[i]的定义, 表示i之前包括i的以nums[i]结尾最长上升子序列的长度 递推: if(nums[i] > nums[j]) dp[i] = max(dp[i], dp[j ...

  5. 最长递增子序列和网易去除最少使从左向右递增又递减问题

    (1)最长递增子序列问题 有两种方法:(1)动态规划方法(2)类似二分查找的方法O(nlogn) 动态规划方法: 以i结尾的序列的最长递增子序列和其[0, i - 1]"前缀"的最 ...

  6. 最长递增子序列问题的求解

    一, 最长递增子序列问题的描述 设L=<a1,a2,-,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,-,akm>,其中k1<k2 ...

  7. 编程之美2.16 最长递增子序列

          这道题目要求返回一个数字,这个数字代表一个数组中最长的递增子序列,当然,不要求这个序列是连续的,比如,有这样一个数组:{1, 3,5,7, 2, 9},那么这个数组的最长递增子序列就是5, ...

  8. 洛谷P2766-最长递增子序列问题

    chunlvxiong的博客 题目描述: 给定正整数序列x1,...,xn (1≤n≤500). 1.计算其最长递增子序列的长度s. 2.计算从给定的序列中最多可取出多少个长度为s的递增子序列. 3. ...

  9. 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

    最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...

  10. Java输出数组中最长递增子序列的代码

    下面内容是关于Java输出数组中最长递增子序列的内容,希望对大伙有较大用途. package com.wzs;import java.util.ArrayList; import java.util. ...

最新文章

  1. Mybatis的工作原理,你了解过吗?
  2. ME | 决定性过程促进了深层土壤微生物空间周转率的增加
  3. Vue creatElement
  4. html类型转换函数,如何在JavaScript中转换数据类型?
  5. c++ io条件状态 的一个例子
  6. Mongoose 中使用 populate 实现关联查询
  7. 视觉中国、IC photo被责令暂停服务全面整改
  8. linux 摄像头设置时间同步,linux系统设置时间同步
  9. 2018-2019 ACM-ICPC, Asia Jiaozuo Regional Contest题解
  10. 位CPU和64位CPU 区别
  11. 线程同步与互斥:POSIX无名信号量
  12. vc如何画圆,并填充颜色
  13. C++实现设计模式——Builder模式
  14. IDEA jsp页面代码没有高亮
  15. 激荡三十年——互联网的崛起
  16. 室内三维物体识别与姿态估计--背景
  17. 2021-05-11 MongoDB面试题 MongoDB中的命名空间是什么意思
  18. 金融IT的“困”与“道”
  19. 应聘者面试的收获-说说工作的正确姿势(20170108)
  20. 分享几张个人在使用的alienware的壁纸

热门文章

  1. Docker网络一览
  2. jQuery中animate()的方法以及$(body).animate({scrollTop:top})不被Firefox支持问题的解决...
  3. [转]vs2003,安装程序检测到另一个程序要求计算机重新启动
  4. Web页面输出Excel的数字问题解决方法
  5. 怎么去掉字符串最后一个逗号
  6. Codeforce842D Vitya and Strange Lesson
  7. linux虚拟机ping通主机
  8. python 读取excel表格的数据
  9. Spring学习笔记(四)
  10. github git clone ssh协议 clone超慢解决方案,提高Github Clone速度