[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;
} 
發佈了47 篇原創文章 · 獲贊 6 · 訪問量 4926
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章