当前位置: 首页 > news >正文

lis最长递增子序列

lis的实现有三种,一种是简单的O(n^2)的dp,第二种是转化为lcs,用原序列排序后得到一个有序的序列,并求两序列的最长公共子序列。这种可以比较方便地打印出答案,复杂度也是O(n^2)。最后是维护一个为某个长度时该长度序列的最后一个数可取的最小值,用了二分查找将复杂度降到O(nlogn)。

 1 //LIS
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <list>
 5 #include <vector>
 6 
 7 using namespace std;
 8 
 9 int dp[105];
10 
11 void lis(int *p, int n) {
12     memset(dp, 0, sizeof(dp));
13 
14     for (int i = 1;i < n;i++) {
15         dp[i] = dp[i - 1];
16         for (int j = 0;j < i;j++)
17             if (p[i] > p[j])dp[i] = max(dp[i], dp[j] + 1);
18     }
19     cout << dp[n - 1];
20 }
21 
22 int d[105][105];
23 void lcs(int*p, int* q, int m, int n) {//m,n为两个数组的长度
24 
25     memset(d, 0, sizeof(d));
26 
27     for (int i = 1;i<m + 1;i++)
28         for (int j = 1;j < n + 1;j++) {
29             if (p[i - 1] == q[j - 1])d[i][j] = d[i - 1][j - 1] + 1;
30             else d[i][j] = max(d[i - 1][j], d[i][j - 1]);
31         }
32 }
33 
34 void print_ans(int* p, int* q, int m, int n) {//lcs的打印
35     if (d[m][n] <= 0)return;
36 
37     if (d[m][n] == d[m - 1][n - 1] + 1) {
38         print_ans(p, q, m - 1, n - 1);
39         cout << p[m - 1];
40     }
41     else if (d[m][n] = d[m - 1][n])
42         print_ans(p, q, m - 1, n);
43     else
44         print_ans(p, q, m, n - 1);
45     //cout << endl;
46 }
47 
48 int binarysearch(int* a, int len, int val) {
49     int left = 0, right = len;//左闭右开
50     while (left < right) {
51         int mid = (left + right) / 2;
52         if (a[mid] > val)
53             right = mid;
54         else if (a[mid] < val)
55             left = mid + 1;
56         else
57             return mid;
58     }
59     return left;
60 }
61 
62 int lis1(int *p, int n) {
63     int *a = new int[n];
64     int length = 1;
65     a[0] = p[0];
66 
67     for (int i = 1;i < n;i++) {
68         if (p[i] > a[length - 1])
69             a[length++] = p[i];
70         else
71             a[binarysearch(a, length, p[i])] = p[i];
72     }
73 
74     delete a;
75     return length;
76 }

 

转载于:https://www.cnblogs.com/schsb/p/8686300.html

相关文章:

  • Python全栈之路系列之深浅拷贝
  • mysql之count,max,min,sum,avg,celing,floor
  • 课堂小练习
  • 【题解】 [POI2012]FES-Festival (差分约束)
  • mac环境下配置nginx
  • 迭代器(Iterator)
  • git设置HTTP代理
  • Box and Ball
  • jsp中的el表达式没有解析
  • android解决AVD中文路径无法启动问题
  • TP5 中引入第三方类库
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • 数据结构中的查找
  • maven之pom.xml
  • tomcat的安装以及环境配置
  • 分享的文章《人生如棋》
  • 03Go 类型总结
  • crontab执行失败的多种原因
  • k8s如何管理Pod
  • Laravel5.4 Queues队列学习
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • vue中实现单选
  • Yii源码解读-服务定位器(Service Locator)
  • 动态规划入门(以爬楼梯为例)
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 码农张的Bug人生 - 见面之礼
  • 前端技术周刊 2019-01-14:客户端存储
  • 正则表达式-基础知识Review
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ###项目技术发展史
  • #162 (Div. 2)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $forceUpdate()函数
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (27)4.8 习题课
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (七)c52学习之旅-中断
  • (转)linux 命令大全
  • .net mvc 获取url中controller和action
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET面试题(二)
  • ::
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • @WebService和@WebMethod注解的用法
  • [C#]科学计数法(scientific notation)显示为正常数字
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [DM复习]Apriori算法-国会投票记录关联规则挖掘(上)
  • [Foreman]解决Unable to find internal system admin account
  • [iOS]随机生成UUID通用唯一识别码
  • [ITIL学习笔记]之事件管理(2)
  • [Java][Liferay] File system in liferay