动态规划之最长公共子序列LCS

动态规划之最长公共子序列LCS,第1张

        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 输入数据 1
abcfbc 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 输入数据 1
ABCBA 
输出数据 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<

 

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1325846.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-12
下一篇2022-06-12

发表评论

登录后才能评论

评论列表(0条)