lcs——最长公共子序列问题

lcs——最长公共子序列问题

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T2428;

思路:画图,比如我们输入abcdef,abcdef,可以画下图:

 

 我们可以得出下列结论:

dp[i][j]={  dp[i-1][j-1]+1 最后一个字母x序列与y序列相等,那么找它前【i-1】和【j-1】个公共子序列就好了呀,加上最后一个不久欧克了

           {     max(dp【i-1】【j】,dp【i】【j-1】),不想等就找x的最后一个与y的前一个的公共子序列和第x的前一个与y的公共子序列哪一个更长就可以了。

另外公共子序列的意思是:

举个例子吧:abcdef和acdefgh,他们的最长公共子序列:acdef,最长公共子序列不是连续的哦,

AC代码如下:

#include<bits/stdc++.h>
 using namespace std;
 string a,b;
 int dp[1010][1010];
 int lcs()
 {
     for(register int i=1;i<=a.length();i++)
     {
         for(register int j=1;j<=b.length();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]);
            }
         } 
    }
    return dp[a.length()][b.length()];
 }
 int main()
 {
     ios::sync_with_stdio(false);
    cin>>a>>b;
    cout<<lcs()<<endl;
     return 0;
 }

 

posted @ 2022-02-13 23:33  江上舟摇  阅读(24)  评论(0编辑  收藏  举报