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 [问 ...
随机推荐
- C# 异步执行操作
为了方便测试异步,先加个计时 计时相关(可以直接跳过该部分) //开始计时 Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); // 停 ...
- 原来你是这样的SpringBoot--Async异步任务
本节我们一起学习一下SpringBoot中的异步调用,主要用于优化耗时较长的操作,提高系统性能和吞吐量. 一.新建项目,启动异步调用 首先给启动类增加注解@EnableAsync,支持异步调用 @En ...
- 《Python魔法大冒险》005 魔法挑战:自我介绍机器人
魔法师和小鱼坐在图书馆的一扇窗户旁,窗外的星空闪烁着神秘的光芒.魔法师轻轻地拍了拍小鱼的肩膀. 魔法师: 小鱼,你已经学会了编写简单的魔法程序,现在我要教你如何创造一个有自己思想的机器人,让它能够和我 ...
- Llama2-Chinese项目:1-项目介绍和模型推理
Atom-7B与Llama2间的关系:Atom-7B是基于Llama2进行中文预训练的开源大模型.为什么叫原子呢?因为原子生万物,Llama中文社区希望原子大模型未来可以成为构建AI世界的基础单位.目 ...
- 「codeforces - 1608F」MEX counting
link. 首先考虑暴力,枚举规划前缀 \([1, i]\) 和前缀 mex \(x\),则我们需要 \(x\) 个数来填了 \([0, x)\),还剩下 \(i-x\) 个数随便填 \([0, x) ...
- vue2中使用antv/G6节点内容可滚动的ER图
先举一个栗子: 效果链接:https://code.juejin.cn/pen/7226264955824930816 如果不会请移步到官网的栗子,请点击查看 狠人话不多,直接给大家上代码: 整体代码 ...
- Makefile 入门教程
Makefile 是一个非常强大的构建自动化工具,用于管理项目的编译.链接和其他构建任务.以下是一个详细的 Makefile 使用文档,包括基本概念.语法.示例和常见任务. 1. 基本概念 目标 (T ...
- Vue之交互
1.get() <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- vue + tornado 个人博客项目简介
vue + tornado 个人博客项目简介 项目链接:https://www.freepd.top 项目链接:https://admin.freepd.top 项目简介 首页预览 本站接入了百度ap ...
- Unity - UIWidgets 3. 页面跳转
Flutter的Route概念, 移动开发常指Page, 在android中指activity, ios中指viewcontroller, UGUI中常称为Panel\Form\View? 大概说的就 ...