正文
nyoj36-最长公共子序列 (LCS)
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
http://acm.nyist.net/JudgeOnline/problem.php?pid=36
最长公共子序列时间限制:3000 ms | 内存限制:65535 KB难度:3
- 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。
tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。 - 第一行给出一个整数N(0<N<100)表示待测数据组数
接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000. - 每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。
2
asdf
adfsd
123abc
abc123abc3
6- 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,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- bootstrap-datetimepicker 日期控件的开始日期
今天做日期控件,需求要求设置一个时间范围限制,选择从今天开始的日期才可以选择,今天以前都不可以选择 主要体现在bootstrap-datetimepicker控件下面的2个日期参数 weekStart ...
- css3——新盒子定义box-sizing
css3对盒子有了新定义,以前的 盒子实际宽(高) = padding + width(height) + ( border * 2); 使用了box-sizing之后盒子实际宽(高) 就等于 wid ...
- Multivariance Linear Regression练习
%% 方法一:梯度下降法 x = load('E:\workstation\data\ex3x.dat'); y = load('E:\workstation\data\ex3y.dat'); x = ...
- ue4 UE4Editor.lib找不到
PublicDependencyModuleNames里加了Launch后,会导致链接UE4Editor.lib, 但这个文件在预编版的引擎里是没有的(奇怪的是自己编译引擎的话会有) 如果只是要头文件 ...
- 谈谈 JavaScript 中的 this 指向问题
JavaScript 中的 this 为一个重难点,它不像静态语言 C#.Java 一样,就表示当前对象.而在 JS 中, this 是运行时确定,而并非定义时就已确定其值. 谈起 this ,必须少 ...
- line-height系列——定义和工作原理总结
一.line-height的定义和工作原理总结 line-height的属性值: normal 默认 设置合理的行间距. number 设置数字,此数字会与当前的字体尺寸相乘来设置行间距li ...
- js编码函数一些区别
s对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 1、 ...
- hibernate之查询
Query对象 方便的对数据库和持久化对象进行查询,两种表达方式:HQL和SQL; Query经常用来绑定查询参数,限制查询条数.并最终执行查询语句. HQL 查询一个简单类(查询所有) @Test ...
- 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange
如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...
- BZOJ 1283: 序列
1283: 序列 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 272 Solved: 151[Submit][Status][Discuss] D ...
我的弱弱的代码:
#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 ;
}