- 浏览: 34154 次
-
最新评论
如果两种特征序列的公共子序列越长表示越接近,现在请你帮助计算出最长的公共特征。
输入说明:
本问题有多组测试数据,第一行就是测试数据的组数(1<=组数<=20)。对于每一组测试数据,有两行,每一行都是有大写英文字母组成的特征序列(1<=特征序列的长度<=1000)。
输出说明:
对于每一组输入,对应的输出只有一行,即最长的公共子序列的长度。
Sample Input:
1
ABDCRHGWDWSDSKJDSKDFHJKFDKJDSAFKJFDAKFDSAJFDKASDJLFLDKF
ERUDSHDFHGFLKGFGFKGFLKSAEWALUTRHGFKIFDGITRMDFLKDSLSDLLEHJFKLEKIREFMFK
Sample Output:
25
#include<iostream>
#include<string>
using namespace std;
#define MAX 1001
int nZ[MAX][MAX];
void vInit(int nA,int nB);
void vGetLcs(string sA,string sB);
int nMax(int nA,int nB);
void vOut(int nA,int nB);
int main()
{
int i;
int nCase;
string sX,sY;
int nX,nY;
cin>>nCase;
for(i=1;i<=nCase;i++)
{
cin>>sX>>sY;
sX=" "+sX;
sY=" "+sY;
nX=sX.size()-1;
nY=sY.size()-1;
vInit(nX,nY);
vGetLcs(sX,sY);
vOut(nX,nY);
}
return 0;
}
void vInit(int nA,int nB)
{
int i,j;
for(j=1;j<=nB;j++)
{
nZ[0][j]=0;
}
for(i=1;i<=nA;i++)
{
nZ[i][0]=0;
}
}
void vGetLcs(string sA,string sB)
{
int i,j;
int nA,nB;
nA=sA.size()-1;
nB=sB.size()-1;
for(i=1;i<=nA;i++)
{
for(j=1;j<=nB;j++)
{
if(sA[i]==sB[j])
{
nZ[i][j]=nZ[i-1][j-1]+1;
}
else
{
nZ[i][j]=nMax(nZ[i][j-1],nZ[i-1][j]);
}
}
}
}
int nMax(int nA,int nB)
{
return(nA>nB?nA:nB);
}
void vOut(int nA,int nB)
{
cout<<nZ[nA][nB]<<endl;
}
输入说明:
本问题有多组测试数据,第一行就是测试数据的组数(1<=组数<=20)。对于每一组测试数据,有两行,每一行都是有大写英文字母组成的特征序列(1<=特征序列的长度<=1000)。
输出说明:
对于每一组输入,对应的输出只有一行,即最长的公共子序列的长度。
Sample Input:
1
ABDCRHGWDWSDSKJDSKDFHJKFDKJDSAFKJFDAKFDSAJFDKASDJLFLDKF
ERUDSHDFHGFLKGFGFKGFLKSAEWALUTRHGFKIFDGITRMDFLKDSLSDLLEHJFKLEKIREFMFK
Sample Output:
25
#include<iostream>
#include<string>
using namespace std;
#define MAX 1001
int nZ[MAX][MAX];
void vInit(int nA,int nB);
void vGetLcs(string sA,string sB);
int nMax(int nA,int nB);
void vOut(int nA,int nB);
int main()
{
int i;
int nCase;
string sX,sY;
int nX,nY;
cin>>nCase;
for(i=1;i<=nCase;i++)
{
cin>>sX>>sY;
sX=" "+sX;
sY=" "+sY;
nX=sX.size()-1;
nY=sY.size()-1;
vInit(nX,nY);
vGetLcs(sX,sY);
vOut(nX,nY);
}
return 0;
}
void vInit(int nA,int nB)
{
int i,j;
for(j=1;j<=nB;j++)
{
nZ[0][j]=0;
}
for(i=1;i<=nA;i++)
{
nZ[i][0]=0;
}
}
void vGetLcs(string sA,string sB)
{
int i,j;
int nA,nB;
nA=sA.size()-1;
nB=sB.size()-1;
for(i=1;i<=nA;i++)
{
for(j=1;j<=nB;j++)
{
if(sA[i]==sB[j])
{
nZ[i][j]=nZ[i-1][j-1]+1;
}
else
{
nZ[i][j]=nMax(nZ[i][j-1],nZ[i-1][j]);
}
}
}
}
int nMax(int nA,int nB)
{
return(nA>nB?nA:nB);
}
void vOut(int nA,int nB)
{
cout<<nZ[nA][nB]<<endl;
}
发表评论
-
最大子段和
2012-01-05 13:59 794给出N个数字, 计算出最大的子段和。 Input 第一行给 ... -
最长不下降子序列长度
2012-01-05 13:55 1356对于序列(1, 7, 3, 5, 9, 4,,有它的一些不下降 ... -
编辑距离问题
2012-01-05 13:48 682#include<iostream> #incl ... -
Kruskal最小生成树
2011-12-08 14:26 720#include<iostream> #inclu ... -
prime
2011-12-01 20:09 627#include<iostream> using ... -
哈弗曼编码
2011-11-28 10:43 1#include<iostream> #defi ... -
哈弗曼编码
2011-11-28 10:42 558#include<iostream> #defi ... -
#贪心算法(零件加工)
2011-10-27 13:25 1013#include<stdio.h> #includ ... -
众数问题
2011-10-20 14:57 814#include <stdio.h> #inclu ... -
输油管道问题
2011-10-13 14:45 628#include <stdio.h> #inclu ... -
幂的精确求值
2011-09-22 15:07 477#include<iostream> using ... -
大数加法
2011-09-22 12:56 638#include<iostream> #incl ... -
三姐妹之出题
2011-09-15 14:15 702#include<iostream> #incl ... -
最大子段和问题(分治)(##)
2011-09-08 21:31 679#include<stdio.h> #defin ... -
最大子段和问题(O(N^2))
2011-09-08 15:04 626#include<stdio.h> int a[ ... -
最大子段和问题(O(N^3))
2011-09-08 14:45 500#include<stdio.h> int a[ ...
相关推荐
【Python求两个字符串最长公共子序列】 在编程领域,字符串操作是常见任务之一,而寻找两个字符串的最长公共子序列(LCS)是其中的一个经典问题。LCS是指两个字符串中都出现过的最长的连续子序列,但不考虑字符在...
动态规划最长子序列(Longest Common Subsequence, LCS)是一种在计算机科学中广泛使用的算法,主要应用于比较序列,如字符串、DNA序列或任何可表示为序列的数据结构。该算法的目标是找出两个序列中的最长公共子序列...
最长子序列(Longest Common Subsequence,简称LCS)是计算机科学中的一种经典问题,主要在算法分析和设计中有着广泛的应用。这个问题涉及到序列比对、文本编辑距离、生物信息学等多个领域。在这个问题中,我们需要...
在源码中,可能会定义一个函数,接收两个字符串参数,返回最长公共子序列,同时,可能会有一个辅助函数用于回溯矩阵找出具体的子序列。 在源码分析中,我们可以看到如何将理论转化为实际的代码逻辑。理解这些代码...
给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以 通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字 典顺序最小的字符串。如果答案不存在,则返回空字符串。 示例...
最长公共子序列是指两个或多个序列中没有重复字符的最长子序列,它不一定是连续的,但必须是这两个序列的真正子序列。在本实验中,我们将重点关注两个字符串的LCS问题。 首先,解决LCS问题的经典方法是使用动态规划...
在这个问题中,给定两个字符串或字符序列A和B,目标是找到这两个序列的最长子序列,这个子序列既在A中也出现在B中,但不必连续。下面我们将深入探讨如何使用动态规划法来解决这个问题。 首先,我们需要理解字符序列...
这个问题的目的是找到两个给定序列的最长子序列,这个子序列不必连续,但必须保持原序列的相对顺序。在文本编辑、生物信息学、软件工程等领域都有广泛的应用。 动态规划是一种解决复杂问题的有效方法,通过将大问题...
第一重循环确定第一个字符串的对齐位置,第二重循环确定第二个字符串的对齐位置,每次循环确定一组两个字符串的对齐位置,并从此对齐位置开始匹配两个字符串的最长子串,如果匹配到的最长子串比已知的最长子串长,则...
LCS是一种在计算机科学中广泛使用的算法,主要用于找出两个序列之间的最长子序列,而这个子序列并不需要在原序列中连续出现。在这个上下文中,"LCS_lcs matlab"表明我们正在处理一个使用MATLAB编程语言实现的LCS算法...
最长公共子序列(Longest Common Subsequence,LCS)是一个在计算机科学中常见的字符串处理问题,它的目标是找到两个字符串的最长子序列,这个子序列并不需要是连续的,但必须保持原有的字符顺序。在给定的代码示例...
这个问题的基本目标是找到两个字符串的最长子序列,这个子序列不需要连续,但必须保持原顺序。在本场景中,我们关注的是使用VC(Visual C++)来实现这个算法,并可视化显示结果。 动态规划是解决LCS问题的主要方法...
在这个问题中,我们寻找两个字符串之间的最长子序列,这个子序列在两个原始字符串中都存在,但不一定连续。这个问题在生物信息学、文本比较和编程竞赛等领域有广泛应用。 动态规划方法是解决最长公共子序列问题的...
最长公共子序列问题是指在一个序列集合中寻找两个(或多个)序列的最长子序列,这个子序列必须是按原来序列的相对顺序出现,但不必连续。序列可以是字符串、数列等。例如,给定序列 "ABCBDAB" 和 "BDCAB",它们的...
在这个问题中,目标是找到两个序列的最长子序列,这个子序列不必连续,但必须在原序列中都存在。 在C#编程语言中解决LCS问题通常分为以下几个步骤: 1. **定义问题**: 假设有两个字符串S1和S2,我们需要找到它们的...
除了最长子序列问题,动态规划还可以应用于其他领域,如背包问题、最短路径问题、字符串匹配等。在解决这类问题时,关键是找到合适的状态表示和状态转移方程,并确保子问题的解能被有效地利用,以避免重复计算。 ...
动态规划是解决这类问题的有效方法,它可以找到两个序列中的最长子序列,这个子序列在原序列中不一定要连续,但必须保持原有的相对顺序。 在C++中实现LCS,首先我们需要理解动态规划的基本思想。动态规划是一种自底...
LCS问题的目标是找到两个或多个字符串中的最长子序列,这个子序列不需要连续,但必须保持原顺序。在文本编辑、生物信息学等领域有着广泛的应用。 分治法思想在解决LCS问题时,可以将问题分解为更小的子问题,然后...
LCS问题的基本概念是:给定两个序列X和Y,找出它们的最长子序列,这个子序列并不一定是连续的,但要在两个原始序列中都存在。例如,对于序列"ABCDGH"和"AEDFHR",其最长公共子序列是"ADH"。 KMP算法,全称为Knuth-...
给定两个字符串S和T,LCS是指S和T中长度最长的子序列,这个子序列不一定是连续的,但要在两个原始字符串中同时存在。例如,如果S="ABCBDAB",T="BDCAB",则它们的LCS是"BDB"。 二、动态规划思路: 动态规划是一种...