nyoj36-最长公共子序列 (LCS)
http://acm.nyist.net/JudgeOnline/problem.php?pid=36
最长公共子序列
- 描述
- 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。
tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。
- 输入
- 第一行给出一个整数N(0<N<100)表示待测数据组数
接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000. - 输出
- 每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。
- 样例输入
-
2
asdf
adfsd
123abc
abc123abc - 样例输出
-
3
6
我的弱弱的代码:
#include <fstream>
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; const int INF=0x7fffffff;
const int N=;
char s1[N],s2[N];
int dp[N][N]; int main()
{
//freopen("D:\\input.in","r",stdin);
//freopen("D:\\output.out","w",stdout);
int n;
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%s %s",s1+,s2+);
int l1=strlen(s1+);
int l2=strlen(s2+);
dp[][]=;
dp[][]=;
dp[][]=;
for(int i=;i<=l1;i++){
for(int j=;j<=l2;j++){
if(s1[i]==s2[j]){
dp[i][j]=+dp[i-][j-];
}else{
dp[i][j]=max(dp[i-][j],dp[i][j-]);
}
}
}
printf("%d\n",dp[l1][l2]);
}
return ;
}
一位coder的代码,加了空间优化:
#include <stdio.h>
#include <string.h>
char s1[], s2[];
int dp[], t, old, tmp;
int main(){
scanf("%d", &t);
getchar();
while(t--){
gets(s1);
gets(s2);
memset(dp, , sizeof(dp));
int lenS1=strlen(s1), lenS2=strlen(s2);
for(int i=; i<lenS1; i++){
old=;
//若s1[i]==s2[j], dp[i][j] = dp[i-1][j-1]+1
//否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])
//此处进行了空间优化,old 代表 dp[i-1][j-1]
//dp[j-1] 代表 dp[i][j-1], dp[j] 代表 dp[i-1][j]
for(int j=; j<lenS2; j++){
tmp = dp[j];
if(s1[i]==s2[j])
dp[j] = old+;
else
if(dp[j-]>dp[j])dp[j]=dp[j-];
old = tmp;
}
}
printf("%d\n", dp[lenS2-]);
}
return ;
}
另一位牛人写的代码,加了时间优化,足足缩短了10倍的时间消耗:
#include <stdio.h>
#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; int n,m;
const int CHAR = ;
const int maxn = ;
int ans[maxn*maxn];
int dp[maxn*maxn];
char S[maxn];
vector<int>v[CHAR]; int er(int l,int r,int x)
{
while(l<=r)
{
int mid = (l+r)/;
if( ans[mid] >= x ) r = mid - ;
else l = mid + ;
}
return l;
} int main()
{
scanf("%d",&n);
while( n-- )
{
for(int i= ; i<CHAR ; i++) v[i].clear(); scanf("%s",S);
int l = strlen(S);
for(int i=l- ; i>= ; i-- ) {
v[ S[i] ].push_back(i); ///S[i]字符在字符串对应的位置
///cout << S[i] << " " << v[ S[i] ].size() << endl;
} int x = ;
scanf("%s",S);
l = strlen(S);
for(int i= ; i<l ; i++ ){
int k = v[ S[i] ].size();
if( k )
{
for(int j= ; j<k ; j++ )
{
dp[x++] = v[ S[i] ][j];
}
}
} m = ;
ans[m] = -<<;
for(int i=; i<x ; i++)
{
int x = er(,m,dp[i]);
ans[x] = dp[i];
if( x == m+ ) m++;
}
printf("%d\n",m);
}
return ;
}
nyoj36-最长公共子序列 (LCS)的更多相关文章
- 1006 最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...
- 动态规划之最长公共子序列LCS(Longest Common Subsequence)
一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...
- 编程算法 - 最长公共子序列(LCS) 代码(C)
最长公共子序列(LCS) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定两个字符串s,t, 求出这两个字符串最长的公共子序列的长度. 字符 ...
- C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解
版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...
- POJ 1458 Common Subsequence(最长公共子序列LCS)
POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...
- 51Nod 1006:最长公共子序列Lcs(打印LCS)
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- 51nod 1006 最长公共子序列Lcs 【LCS/打印path】
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- 每日一题-——最长公共子序列(LCS)与最长公共子串
最长公共子序列(LCS) 思路: 代码: def LCS(string1,string2): len1 = len(string1) len2 = len(string2) res = [[0 for ...
- 51nod 1006:最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
随机推荐
- Bitdefender Total Security 2014 Free 6 Months & 12 month License Key
German Only – Bitdefender Total Security 2014 Free 6 Months Serial License Keyhttp://www.bitdefender ...
- 201621123005《java程序设计》第八次实验总结
201621123005<Java程序设计>第八次实验总结 1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1 ...
- New Concept English Two 24 64
$课文62 大火之后 650. Firemen had been fighting the forest for nearly three weeks before they could get i ...
- emmc boot_config文件不存在
/******************************************************************************* * emmc boot_config文 ...
- python中的运算符优先级(其它语言也试用)
- Windows Server Core Command (管理服务器核心的具体操作命令)
从 Windows Server 2008 开始,管理员可以选择安装具有特定功能但不包含任何不必要功能的 Windows Server 的最小安装服务器核心(Server Core),它为一些特定服务 ...
- django创建第一个项目helloworld
环境:centos 7,已安装python 3.6环境 1.安装django并创建django第一个项目 1.1.使用pip安装django# pip install Django或指定安装版本# p ...
- UOJ 348 【WC2018】州区划分——子集卷积
题目:http://uoj.ac/problem/348 参考:https://www.cnblogs.com/NaVi-Awson/p/9242645.html#%E5%AD%90%E9%9B%86 ...
- linux shell 模拟post请求
Linux 下curl模拟Http 的get or post请求. 一.get请求 curl "http://www.baidu.com" 如果这里的URL指向的是一个文件或 ...
- angular指令的详细讲解,不断补充
独立作用域:就是在指令中设置了scope: **** ·false 共享父作用域 ·true 继承父作用域,并且新建独立作用域 ·object 不继承父作用域,创建新的独立作用域 一般来说我们会使用第 ...