码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-02-21 12:47:04      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

题目链接: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;
}

 

 

 

 

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

标签:

原文地址:http://www.cnblogs.com/TreeDream/p/5204625.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!