最长公共子序列问题入门

这也是一道关于动态规划比较经典的题目,也就是将原问题分成一个个子问题,
用一个二维数组 dp[i][j]表示S1字符串中前i个字符和S2字符串中前j个字符分别组成的最长公共子序列,而其中就等于 max(dp[i-1][j],dp[i][j-1]),再加上默认值 dp[o][j]=0和dp[i][0]=0.
在这里插入图片描述
在这里插入图片描述
问题就是:
在这里插入图片描述
(首先要知道,这里的子序列不一定是连续的,只要是一部分的就行。)
然后需要搞清楚,对于s1[x]和s2[y]这两种的最后一个值相不相同的情况做一个区分,如果最后一个是相同的话,那么一定是 dp[x-1][y-1]+1 也就是加上最后一个数组,如果s1[X]和S2[Y]的最后一个不相同的话,需要知道,就是dp[x[[y[=max(dp[x-1][y],dp[x][y-1])中的一个

刚开始没有初始化dp,所以绕了一点弯路

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
#include<stack>
using namespace std;
//最长公共子序列
int main()
{
    char Str1[20];
    char Str2[20];
    //先输入他们对应的值
    scanf("%s%s",Str1,Str2);
    //再求他们的长度
    int le1=strlen(Str1)-1;
    int le2=strlen(Str2)-1;
   // printf("%d %d",le1,le2);
    //再创建一个求最长子序列的二维数组
    int dp[20][20]={0};
    //再初始化
    dp[0][le2]=0;
    dp[le1][0]=0;//当其中有一个是0的时候,那么最长子序列一定是0
    //再开始遍历
    for(int i=1;i<=le1;i++)
    for(int j=1;j<=le2;j++){
        if(Str1[i]==Str2[j])
            dp[i][j]=dp[i-1][j-1]+1;
        else
            dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
    }
    printf("%d",dp[le1][le2]);

}

发布了88 篇原创文章 · 获赞 5 · 访问量 3530

猜你喜欢

转载自blog.csdn.net/qq_41115379/article/details/105208291