最长公共子序列问题模板 hdu ——1159 dp入门系列

题意就不在赘述

方法其实就是最长公共子序列模板求解

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>

using namespace std;

int dp[1000][1000];//dp[i][j]表示第一个串的第i个字符和第二个串的第j个字符的最长公共子序列长度;

void ini()
{
    memset(dp,0,sizeof(dp));
}

int main()
{
    string s,s2;
    while(cin>>s>>s2)
    {
        ini();
        for(int i=0;i<s.size();i++)//模板开始
        {
            for(int j=0;j<s2.size();j++)//这里使用了i+1,j+1,是为了避免数组下标为负数,导致RE;
            {
                if(s[i]==s2[j]) dp[i+1][j+1]=dp[i][j]+1;//如果在i,j时两个字符相等,那么他的状态一定是i-1,j-1,个字符传来的
                else dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);//如果不相等,那么则可能是第一个串的第i-1个字符向后移一位得到,或者第二个串的第j-1个字符向后移一位;
            }
        }//模板结束
        cout<<dp[s.size()][s2.size()]<<endl;
        s.clear();
        s2.clear();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41670466/article/details/81544261