解题思路:
 捕获3.JPG


1642592479241376.png

注意事项:
第一张原图里字符串前的""是特意留出的,可以理解为空,可以直接忽略不看,红笔是i,j的值从1开始,黑笔是数组下标。

第二张图是递归公式,C[i,j]代表LCS长度,例如C[1,2]中X1=Y2=a,所以C[1][2]=C[0][1]+1=1

C[1][3]=max(C[0][3],C[1][2])=1

参考代码:

#include<iostream>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include <vector>
using namespace std;
int Max(string s1,string s2);
int main() {
    string s1,s2;
    cin >> s1 >> s2;
    Max(s1, s2);
    return 0;
}
int Max(string s1,string s2)
{
    int len1 = s1.size(),len2=s2.size(),maxlen;
    if (len1 > len2)
        maxlen = len1;
    else
        maxlen = len2;
    int dp[100][100]={0}; //矩阵初始全为0
    for (int i = 1; i <= len2 ; i++) //i代表len2即竖着的列(ace)
    {
        for (int j = 1; j <= len1 ; j++) //j代表len1即横着的行(babcde)

        {
        
            if ( s2[i-1]==s1[j-1] )//这里虽然i和j都是从1开始的,但是储存在数组里的字符串还是从下标0开始的!!!

                                            //由第一张图可得i=1对应a,j=1对应b。所以判断条件是s2[i-1]==s1[j-1]

            {
                dp[i][j] = dp[i-1][j-1] + 1;
            }
            else
            {
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
            //cout << dp[i][j]<<" ";
        }
        //cout << endl;
    }
    cout << maxlen - dp[len2][len1];
    return 0;
}

点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论