POJ - 1458共通部分(LCS最長共通部分列)

質問の意味:
2つの文字列を与えられ、最長共通部分列のサイズを見つけます。
考えること:
おそらく今最も古典的なLCSの問題です。
セット\(X =(X_1、X_2 、..... x_nに関する) およびY =(Y_1、Y_2、..... y_m)は\) 二つの配列、最長共通シーケンスXとYのノートです\(LCS(X、Y) \) 、見つけるために\(LCS(X、Y)は \) に最適な問題であり
、我々は、部分問題に分解する必要があり、部分問題に最適なソリューションを見つけるために:(子を探して現在の問題の打ち上げへの質問、状態遷移段階の方程式を見つけることが最も重要である)
1)の場合、\(Y_M x_nに関する= \) XとYの最後の要素である、共通のサブ要素が存在しなければならないことを示している、最後の要素と同じですシーケンス。したがって、今見ている:\(LCS(1-N-X_ {}、{。Y_ 1-M})\)
\(LCS(1-N-X_ {}、{。Y_ 1-mは})\)元の問題ですサブ問題
場合2)\(!x_nに関する= y_m \)バック二つのサブ問題には、再帰的に検索する:\(LCS(1-N-X_ {}、Y {M})とLCS(X_ {N}、Y_ { } 1-M)\)
\(LCS(1-N-X_ {}、Y_M)\)を表し:最長共通配列がされてもよい((X_1、X_2、.... \ X_ {N-1}) と( Y_1、Y_2、... y_n)\ ) を探しに
\(LCS(x_nに関する、Y_ { M-1})\)表す:最長共通配列をすることができる\((X_1、X_2、... x_nに関する) 及び(Y_1、Y_2、... Y_ { N-1})\) 探しに
、最終的に次の再帰を得ました(再帰)式:だから再発を解決することができます

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(0); cin.tie(0);
#define accept 0
#define mp make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int inf = 0x3f3f3f3f;
const int maxn = 1e3+7;
const int maxm = 1e6+7;
const int mod = 1e9+7;

int dp[maxn][maxn];
char a[maxn],b[maxn];
int main(){
    while(~scanf("%s%s",a,b)){
        memset(dp,0,sizeof(dp));
        int lena = strlen(a);
        int lenb = strlen(b);
        for(int i=1;i<=lena;i++){
            for(int j=1;j<=lenb;j++){
                if(a[i-1]==b[j-1]){
                    dp[i][j] = dp[i-1][j-1]+1;
                }
                else{
                    dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        printf("%d\n",dp[lena][lenb]);
    }
}

おすすめ

転載: www.cnblogs.com/Tianwell/p/11414581.html