最长公共子序列

//最长公共子序列
#include<bits/stdc++.h>
using namespace std;
//设f[i][j]表示序列a[1....i]和b[1....j]的最长公共子序列长度
//现在考察末尾元素a[i]与b[j]是否再公共子序列中
//(1)若a[i]=b[j],则a[i]与b[j]在公共子序列中
//所以f[i][j]=f[i-1][j-1]+1
//(2)若a[i]!=b[j],且a[i]不在公共子序列中,则可去掉a[i]
//所以f[i][j]=f[i-1][j]
//(3)若a[i]!=b[j],且b[j]不在公共序列中,则可去掉b[j]
//所以f[i][j]=f[i][j-1]
//特殊情况:a[i]!=b[j]且a[i]、b[j]均不在公共序列中,这种情况可以看成是第二第三情况的任意一种
则有:
/*
边界条件:
f[0][j]=0;f[i][0]=0; 
*/
//p数组是记录前驱的位置 
for(int i=1;i<=m;i++)
{
    for(int j=1;j<=n;j++)
    {
        if(a[i]==b[j])
        {
            f[i][j]=f[i-1][j-1]+1;
            p[i][j]=1;//左上方 
        }
        else if(f[i][j-1]>f[i-1][j])
        {
            f[i][j]=f[i][j-1];
            p[i][j]=2;//左边 
        }
        else
        {
            f[i][j]=f[i-1][j];
            p[i][j]=3;//上边 
        }
    }
}
cout<<f[m][n];
//接下来是利用前驱数组来找寻最长公共子序列究竟是谁
int i,j,k;
char s[200];
i=m;j=n;k=f[m][n];
while(i>0&&j>0)
{
    if(p[i][j]==1)//左上方
    {
        s[k--]=a[i-1];
        i--;
        j--;
    } 
    else if(p[i][j]==2)//左边 
    {
        j--;
    }
    else//上边 
    {
        i--;
    }
}
for(int i=1;i<=f[m][n];i++)
{
    cout<<s[i];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值