动规,模拟,递推,最长公共子序列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动规,模拟,递推,最长公共子序列相关的知识,希望对你有一定的参考价值。

题目链接:http://poj.org/problem?id=1458

解题报告:

1、用二维数组模拟两个字符串上每个子串对应的最长公共子序列。

2、显然,就是要求二维数组最右下的数字

3、递推公式:

if(s1[i-1]==s2[j-1])
    maxlen[i][j]=maxlen[i-1][j-1]+1;
else maxlen[i][j]=max(maxlen[i][j-1],maxlen[i-1][j]);

Memory: 1024KTime: 0MSLanguage: C++Result: Accepted

 

#include <iostream>
#include <string.h>
#include <algorithm>
#define MAX 1000
using namespace std;

char s1[MAX];
char s2[MAX];
int maxlen[MAX][MAX];///maxlen[i][j]表示s1左边的第i个字符形成的子串,与s2左边的j个字符形成子串,的最长公共子序列的长度

int main()
{
    while(cin>>s1>>s2)
    {
        int len1=strlen(s1);
        int len2=strlen(s2);
        ///结果就是要求maxlen[len1][len2];这里采用动规的方法递推
        int i,j;
        for(i=0;i<=len1;i++)
            maxlen[i][0]=0;
        for(j=0;j<=len2;j++)
            maxlen[0][j]=0;
        for(i=1;i<=len1;i++)
        {
            for(j=1;j<=len2;j++)
            {
                if(s1[i-1]==s2[j-1])///这里从s1的第一个字符开始与s2比较
                    maxlen[i][j]=maxlen[i-1][j-1]+1;
                else maxlen[i][j]=max(maxlen[i-1][j],maxlen[i][j-1]);
            }
        }
        cout<<maxlen[len1][len2]<<endl;
    }
    return 0;
}

 

 

 

 

以上是关于动规,模拟,递推,最长公共子序列的主要内容,如果未能解决你的问题,请参考以下文章

动规-最长公共子上升序列

动规-最长公共子上升序列

动规-最长公共子上升序列

动规-最长公共子上升序列

动规讲解基础讲解五——最长公共子序列问题

计算最长公共子序列复杂度的数学递推关系