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,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
随机推荐
- CS231n课程笔记翻译9:卷积神经网络笔记
译者注:本文翻译自斯坦福CS231n课程笔记ConvNet notes,由课程教师Andrej Karpathy授权进行翻译.本篇教程由杜客和猴子翻译完成,堃堃和李艺颖进行校对修改. 原文如下 内容列 ...
- Yii用AJAX注册验证
<script type="text/javascript"> $(document).ready(function(){ $('#RegisterForm_usern ...
- python的pip源在windows和linux修改
windows和linux修改python的pip源 https://www.cnblogs.com/cwp-bg/p/8497075.html windows和linux修改python的pip源 ...
- prisma 集成tidb 安装试用
以前官方提供的ansible 的脚本,现在有了docker的版本,可以方便测试使用 实际完整配置参考 https://github.com/rongfengliang/prisma-tidb 安装ti ...
- jQuery因mouseover,mouseout冒泡产生的闪烁问题
由于浏览器的冒泡行为.造成如果在一个DIV元素上同时定义了mouseover,mouseout的时候,当鼠标移动到DIV中的child子元素的时候,就会同时执行了两个操作mouseover和mouse ...
- centos下memcached安装
memcached是一款高速.分布式的内存缓存系统.其官方主页在http://www.danga.com/memcached/ 1.安装前的准备 要安装memcached,需要有libevent的支持 ...
- 移植wpa_supplicant2.5及界面配置wifi(原创)
JP5G开发机上需要图形界面配置 wifi网络,为此移植了wpa_supplicant2.5. 1.参考wpa_supplicant-2.5移植与使用l http://blog.csdn.net/hk ...
- Web验证方式(1)--Http Basic Authentication
Http Basic Authentication是HTTP协议中定义的Web系统中的验证方式.参考wiki 主要的实现机制如下: 1. 用户通过浏览器匿名访问web资源. 2. web服务器检测到w ...
- Python的学习计划
整体进度(6-7个月毕业)一.(2月左右)Python基础二.数据库(1-2周)---存储数据和信息(本质上和文件没有区别) 增删改查更方便了三.前端(2周左右)---html.css等等四.框架(2 ...
- C# 转义字符 '\'反斜杠
在代码中经常用到表示路径的字符串,如何正确转换反斜杠? 如要将"C:\123"转换成"C:\\123" 如何转换? 方法: string str="C ...