[C++]最长公共子序列问题

[C++]最长公共子序列问题

最长公共子序列问题:
给定两个字符串s1s2···sn和t1t2···tn。求出这两个字符串最长的公共子序列的长度。字符串s1s2···sn的子序列可以表示为s(i1)s(i2)···s(in)(i1<i2<in)的序列
输入格式:
n m
s
t
输出格式:
最长子序列长度

输入:
4 4
abcd
becd
输出:
3

解题思路:当si+1等于tj+1,有三种情况,第一种是在s1··si与t1···tj的公共子序列末尾加上si+1,第二种是s1··sn与t1···ti+1的公共子序列,第三种是s1··si+1与t1···ti的公共子序列

#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 10000;

int n;
int m;

string s, t;
int dp[maxn+1][maxn+1];

int main(){
    cin>>n>>m;
    
    cin>>s>>t;
    for(int i = 0; i<n; i++){
        for(int j = 0; j<m; j++){
            if (s[i] == t[j]) {
                dp[i+1][j+1] = dp[i][j] + 1;
            }
            else {
                dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j]);
            }
        }
    }
    
    for(int i = 0; i<=n; i++){
        for(int j = 0; j<=m; j++){
            cout<<dp[i][j]<<" ";
        }
        cout<<endl;
    }
    
    cout<<dp[n][m]<<endl;

    
    return 0;
} 
发布了63 篇原创文章 · 获赞 8 · 访问量 7196

猜你喜欢

转载自blog.csdn.net/s1547156325/article/details/104433615