uva10635(lcs lis O(NlgN))
来源:互联网 发布:linux镜像文件iso下载 编辑:程序博客网 时间:2024/06/02 23:09
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=18&page=show_problem&problem=1576
题干大意: 找最长的类似子字符串
考虑:
首先想到用类似lcs的方式计算结果,但是250^2^2显然内存放不下而且也超时,之后网上看到了lis lcs的NlgN的时间复杂度O(N)的空间复杂度的算法
lis O(NlgN)
定义状态i表示长度为i的递增序列的尾元素,显然,dp[i]是个递增序列,所以就可以通过二分来索引对应的位置,然后逐个更新并记录Len,最后lis的结果就是len
以上思路比较简单实现也不难
比较巧妙的是通过lis的方式实现lcs
方法是将一个字符串的所有字符替换为另一个字符串中对应字符出现的所有位置(因此如果字符全相同本算法将会退化n^2lgn)
在此推荐一个pdf非常接地气,看懂基本没压力http://www.cs.ucf.edu/courses/cap5937/fall2004/Longest%20common%20subsequence.pdf
以上本题基本就没问题了
以下ac代码
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;#define MEMSET(a) memset(a,0,sizeof(a))const int MAXN=62505;int A[MAXN];int B[MAXN];int C[MAXN];int D[MAXN];int f[MAXN];int n;int p;int q;int lis(){ MEMSET(f); f[1]=D[1]; int len=1; for(int i=2;i<=q;i++){ int start=1,last=len; while(1){ if(start>=last) break; int mid=(last+start)/2; if(f[mid]<D[i]&&f[mid+1]>=D[i]){ start=mid; break; } if(f[mid]>=D[i]) last=mid; else start=mid+1; } if(start==len&&D[i]>f[start]) f[++len]=D[i]; else if(D[i]>f[start]) f[start+1]=min(D[i],f[start+1]); } return len;}int main(){ //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); int T; scanf("%d",&T); int kase=1; while(T--){ MEMSET(D); MEMSET(A); MEMSET(B); MEMSET(C); scanf("%d %d %d",&n,&p,&q); p=p+1; q=q+1; for(int i=1;i<=p;i++) scanf("%d",&A[i]); for(int i=1;i<=q;i++) scanf("%d",&B[i]); int k=1; for(int i=1;i<=p;i++) C[A[i]]=k++; for(int i=1;i<=q;i++) D[i]=C[B[i]]; printf("Case %d: %d\n",kase++,lis()); } return 0;}
0 0
- uva10635(lcs lis O(NlgN))
- [LCS][LIS]Uva10635]
- uva10635 Prince and Princess LCS 变 lIS
- uva10635(LCS转换为求LIS)
- uva10635 【LIS】
- uva10635 王子和公主(把lcs转化为lis)
- UVa10635--Prince and Princess(LCS转LIS)
- uva10635 Prince and Princess(LCS转LIS)
- LIS O(nlgn)最简写法
- 最长上升子序列LIS O(nlgn)算法
- zoj2136 最长上升子序列LIS O(NlgN)解法
- 【动态规划14】UVA10635 Prince and princess(LCS转LIS)
- O(nlogn)LIS及LCS算法
- O(nlogn)实现LCS与LIS
- LCS时间复杂度O(NlogN) (LCS 转 LIS)
- O(nlog(n)) LCS 白书 P66例题27 UVa10635
- LIS(nlgn) DP
- UVa1471 LIS变种 nlgn
- 全局编码
- Codeforces Round #383 (Div. 2)
- 走在20出头的路上
- [jQuery知识]jQuery之知识九-事件高级
- Nginx是什么,有什么优点?为什么选择Nginx做web服务器软件?
- uva10635(lcs lis O(NlgN))
- 1. Two Sum
- 三、向量的加减乘除法
- C++静态成员复习笔记
- 你知道android中的视差特效吗
- Bootstrap学习总结笔记(18)-- 基本插件之Tooltip提示工具
- 控制器Controller
- BadBoy参数化和乱码处理
- Android开发——service直接启动activity