LIS和LCS算法分析
LIS(最长上升子序列)
常规的解法就是动态规划。
mx[ j ]表示长度为j的上升子序列最小的值a[i];
dp[ i ]表示前i个数的最长上升子序列长度多少。
1 for(int i=1;i<n;i++)
2 {
3 int j;
4 for( j=len;j>0;j--)
5 {
6 if(a[i]>mx[j])
7 {
8 dp[i]=j+1;
9 mx[dp[i]]=min(mx[dp[i]],a[i]);//更新长度为j+1的最小值
10 break;
11 }
12 }
13 if(j==0)//说明它是最小的
14 {
15 dp[i]=1;
16 mx[dp[i]]=min(mx[dp[i]],a[i]);//更新
17 }
18 }
这就是解决LIS的核心代码,时间复杂度网上的博客说复杂度是O(n2) 说实话,个人感觉没有那么高的复杂度,比如HDU-5532就可以用这个方法解决,但是如果按n*n的复杂度来说是肯定要tle的,结果时间是982ms。看了一下,甚至比其他的更快了一些。。。
LIS在时间上的优化那就只能用n*logn的算法了
这个算法其实已经不是DP了,有点像贪心。至于复杂度降低其实是因为这个算法里面用到了二分搜索。本来有N个数要处理是O(n),每次计算要查找N次还是O(n),一共就是O(n^2);现在搜索换成了O(logn)的二分搜索,总的复杂度就变为O(nlogn)了。
ps:最近还没用这个算法,感觉dp就挺好用的,等用了在更新吧,hhhhhh
LCS(最长公共子序列)
既然放在一起写,那么肯定有共同的地方,原理还是dp。
感觉还是由一个题目来看看到底怎么解决吧。
LCS裸题:HDU-1159
Input
abcfbc abfcab
programming contest
abcd mnpOutput
4
2
0Sample Input
abcfbc abfcab
programming contest
abcd mnpSample Output
4
2
0

想一想是不是所有的情况都包括进去了
那么我们就可以在O(n*m)的复杂度解决这个问题了
1 #include<iostream>
2 #include<stdio.h>
3 #include<algorithm>
4 #include<string.h>
5 using namespace std;
6 char a[1050],b[1050];
7 int dp[1050][1050];
8 int main()
9 {
10 while(~scanf("%s %s",&a,&b))
11 {
12 memset(dp,0,sizeof(dp));
13 int alen=strlen(a);
14 int blen=strlen(b);
15 for(int i=1;i<=alen;i++)
16 {
17 for(int j=1;j<=blen;j++)
18 {
19 if(a[i-1]==b[j-1])
20 {
21 dp[i][j]=dp[i-1][j-1]+1;
22
23 }
24 else
25 {
26 dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
27 }
28 }
29 }
30 cout<<dp[alen][blen]<<endl;
31 }
32 return 0;
33 }
LIS和LCS算法分析的更多相关文章
- LIS和LCS LCIS
首先介绍一下LIS和LCS的DP解法O(N^2) LCS:两个有序序列a和b,求他们公共子序列的最大长度 我们定义一个数组DP[i][j],表示的是a的前i项和b的前j项的最大公共子序列的长度,那么由 ...
- O(nlogn)LIS及LCS算法
morestep学长出题,考验我们,第二题裸题但是数据范围令人无奈,考试失利之后,刻意去学习了下优化的算法 一.O(nlogn)的LIS(最长上升子序列) 设当前已经求出的最长上升子序列长度为len. ...
- UVa 111 History Grading (简单DP,LIS或LCS)
题意:题意就是坑,看不大懂么,结果就做不对,如果看懂了就so easy了,给定n个事件,注意的是, 它给的是第i个事件发生在第多少位,并不是像我们想的,第i位是哪个事件,举个例子吧,4 2 3 1, ...
- 关于LIS和LCS问题的o(nlogn)解法
o(n^2)解法就不赘述了,直接解释o(nlogn)解法 LIS最长递增子序列: 先明确一个结论:在长度最大为len的递增序列里若末尾元素越小,该递增序列越容易和后面的子序列构造出一个更长的递增子序列 ...
- LIS与LCS的nlogn解法
LIS(nlogn) #include<iostream> #include<cstdio> using namespace std; ; int a[maxn]; int n ...
- DP---DAG、背包、LIS、LCS
DP是真的难啊,感觉始终不入门路,还是太弱了┭┮﹏┭┮ DAG上的DP 一般而言,题目中如果存在明显的严格偏序关系,并且求依靠此关系的最大/最小值,那么考虑是求DAG上的最短路或者是最长路.(据说 ...
- LIS LCS n^2和nlogn解法 以及LCIS
首先介绍一下LIS和LCS的DP解法O(N^2) LCS:两个有序序列a和b,求他们公共子序列的最大长度 我们定义一个数组DP[i][j],表示的是a的前i项和b的前j项的最大公共子序列的长度,那么由 ...
- O(nlogn)实现LCS与LIS
序: LIS与LCS分别是求一个序列的最长不下降序列序列与两个序列的最长公共子序列. 朴素法都可以以O(n^2)实现. LCS借助LIS实现O(nlogn)的复杂度,而LIS则是通过二分搜索将复杂度从 ...
- UVA - 10635 LIS LCS转换
白书例题,元素互不相同通过哈希转换为LIS求LCS #include<iostream> #include<algorithm> #include<cstdio> ...
- LCS,LIS,LCIS
网站:CSUST 8月3日(LCS,LIS,LCIS) LCS: 以下讲解来自:http://blog.csdn.net/yysdsyl/article/details/4226630 [问 ...
随机推荐
- crypto 加解密库简介与测试【GO 常用的库】
〇.前言 GO 语言的标准库 crypto 提供了一组用于加密和解密的包,包括对称加密.哈希函数.数字签名.随机数生成等功能.在日常开发中,通过使用这些库,可以确保数据的安全性和完整性. 对于使用频率 ...
- MySQL系列2:InnoDB存储引擎
1. 架构回顾 上一篇我们讲解了MySQL的逻辑架构,重新回顾一下,用一张新的图来认识一下该架构. 整体架构分为service层与存储引擎层,请求交给连接池后,由后台线程处理,并将请求转发给SQL接口 ...
- python基础:元组(tuple)列表(list)介绍
一,元组 1.元组的创建(可以把元组看作一个容器,任何数据类型都可以放在里面)通过赋值方法创建元组In [5]: t = ("hello",2.3,2,True,{1:" ...
- 命令行获取chrome版本的多个方法
命令行获取chrome版本的多个方法 基于win10 测试 背景 在selenium的驱动安装中用webdriver_manager自动处理chromedriver是比较好的做法 webdriver_ ...
- 探秘公有IP地址与私有IP地址的区别及其在路由控制中的作用
引言 IP地址是互联网通信中至关重要的组成部分.虽然在前一章节我们讲解了IP一些基础知识,但在我们日常生活中,我们经常听到公有IP地址和私有IP地址这两个术语.那么,公有IP地址和私有IP地址有何区别 ...
- Apollo2.1.0+Springboot使用OpenApI
依赖管理 <!-- bootstrap最高级启动配置读取 --> <dependency> <groupId>org.springframework.cloud&l ...
- 手动实现Transformer
Transformer和BERT可谓是LLM的基础模型,彻底搞懂极其必要.Transformer最初设想是作为文本翻译模型使用的,而BERT模型构建使用了Transformer的部分组件,如果理解 ...
- c语言代码练习8
//输入两个数组,输出两个数字的最大公约数#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int n = ...
- OPPO主题组件开发 - 组件内容自适应
OPPO桌面有 3*5.3*6.4*5.4*6.5*5.5*6 等布局,随着布局不同,组件大小也会发生改变:不同型号手机分辨率不同,组件大小也不一致.这就要求组件内容做到自适应. 说明 OPPO主题组 ...
- 开发微信小程序技术栈
开发微信小程序主要需要以下技术栈: 小程序框架参考文档 小程序组件参考文档 小程序 API 参考文档 小程序服务端 API 参考文档 微信开发者工具参考文档 微信云托管参考文档 微信云开发参考文档 1 ...