蓝桥杯ADV-1020_试题 算法提高 最长公共子序列

题目描述:

资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s

问题描述
  给定两个字符串,寻找这两个字串之间的最长公共子序列。

输入格式
  输入两行,分别包含一个字符串,仅含有小写字母。

输出格式
  最长公共子序列的长度。

样例输入

abcdgh
aedfhb

样例输出

3

样例说明

  最长公共子序列为a,d,h。

数据规模和约定

  字串长度1~1000。 

算法描述:线性DP、最长公共子序列

分析:

两串向后移动关系三种情况:01、10、11

#include<iostream>
using namespace std;

const int N = 1010;
int n, m;
string a, b;
int f[N][N];

int main()
{
    cin >> a >> b;
    int n = a.size(), m = b.size();
    for(int i = 1 ; i <= n ; i ++)
        for(int j = 1 ; j <= m ; j ++)
        {
            f[i][j] = max(f[i-1][j], f[i][j-1]);
            if(a[i - 1] == b[j - 1]) f[i][j] = max(f[i][j], f[i-1][j-1] + 1);
        }
    cout << f[n][m] << endl;
    return 0;
}
posted @ 2022-09-11 14:02  D_coding_blog  阅读(60)  评论(0)    收藏  举报