
Q:有一天,你突然对“少年科学院”感兴趣,在百度百科上搜索,因为在百度百科上没有这个词条,于是就d出与“少年科学院”相似有关的词条,排除大众浏览量与字典序的话,那么,它是如何排序的呢???
最长公共子序列(LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题。一个数列 ,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则称为已知序列的最长公共子序列
以上为百度百科的解释,说的通俗一些,就是两个字符串,求出他们相同的子序列,求出最长的长度。
方法有许多
1.贪心,时间复杂度是O(n³),跑得慢
2.DP,今天的主角
如果用一个二维数组dp表示字符串X和Y中对应的前i,前j个字符的LCS的长度话,那我们就可以得到这两条公式。
a,b为两个字符串
if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
说了那么多,来看一下模板吧,Show me the code!!!
Q:a,b两个字符串的LCS
#include
using namespace std;
int lena,lenb,dp[1005][1005];
string a,b;
int main()
{
cin>>a>>b;
lena=a.size();
lenb=b.size();
for(int i=1;i<=lena;i++)
{
for(int j=1;j<=lenb;j++)
{
if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
cout<
问题A最长公共子序列(模板题)
Description
给你一个序列 X 和另一个序列 Z,当 Z 中的所有元素都在 X 中存在,并且在 X 中的下标顺序是严格递增的,那么就把 Z 叫做 X 的子序列。
例如:Z = < a,b,f,c > 是序列 X = < a,b,c,f,b,c > 的一个子序列,Z 中的元素在 X 中的下标序列为 < 1,2,4,6 >。
现给你两个序列 X 和 Y,请问它们的最长公共子序列的长度是多少?
Format Input输入包含多组测试数据。每组输入占一行,为两个字符串,由若干个空格分隔。每个字符串的长度不超过 100。
Output对于每组输入,输出两个字符串的最长公共子序列的长度。
Samples 输入数据 1abcfbc abfcab
programming contest
abcd mnp
输出数据 1
4
2
0
#include
using namespace std;
string a,b;
int main()
{
while(cin>>a>>b)
{
int dp[1005][1005];
int lena=a.size();
int lenb=b.size();
for(int i=1;i<=lena;i++)
{
for(int j=1;j<=lenb;j++)
{
if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
cout<
问题B密码脱落
Description
X星球的考古学家发现了一批古代留下来的密码。
这些密码是由 A、B、C、D 四种植物的种子串成的序列。
仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。
你的任务是:
给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。
Format Input输入一行,表示现在看到的密码串(长度不大于 1000) 。
Output要求输出一个正整数,表示至少脱落了多少个种子。
Samples 输入数据 1ABCBA
输出数据 1
0
输入数据 2
ABECDCBABC
输出数据 2
3
#include
using namespace std;
int dp[1005][1005];
string s,a;
int main()
{
cin>>s;
for(int i=s.size()-1;i>=0;i--)
{
a+=s[i];
}
int lena=a.size();
int lenb=s.size();
for(int i=1;i<=a.size();i++)
{
for(int j=1;j<=s.size();j++)
{
if(a[i-1]==s[j-1]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
cout<
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)