ダイナミックプログラミング(最長増加部分列)---最長共通部分列

最長共通部分列

  2つのサブシーケンスS1及びS2のために、その最長の共通のサブシーケンスを見つけます。

  DPは、[I] [j]はS1Iを考慮した最初のj個の文字のi番目の文字S1とS2の前部の最長共通部分列の長さを表しDPは、最長共通サブシーケンスの長さを格納するための二次元アレイを定義しますS2j値は、次の2つの場合に分け、同じです。

  • とき、それはS1IのJ-1前にこの値を基と結合することができるS1I == S2j I-1最長共通部分列の文字S1とS2の前の文字、プラス最長共通部分列の長さに1、すなわち、DP [I] [J] = DP [I-1] [J-1] + 1。
  • ときS1I!= S2j、I-1および最長共通サブシーケンスS2の最初のj個の文字、またはJ-1の前に、i番目の文字S1およびS2に先立って前の文字の最長共通部分列S1の場合その最大値を取る最長共通サブキャラクタ、即ちDP [I] [J] =最大{DP [I-1] [j]は、DP [I]、[J-1]}。

  Mの系列長Nと長さS1とS2の配列については、DP [N] [M]は最長共通部分列長配列S1と配列S2です。

最長の増加サブシーケンスと比較すると、最長共通部分列は、次のような違いがあります。

  • 二つの配列のために、彼らの最長共通部分列を求めています。
  • 最長の増加配列、DP [i]はSi終端最長増加系列長で表現さ、サブシーケンスは、Siが含まれている必要があり、最長共通サブシーケンス、DPにおける[I] [J] S1は正面を表します最長共通サブシーケンスS2のi番目の文字、長さが最初のj個の文字は、必ずしもS1IおよびS2jが含まれていません。
  • 最終溶液を求める際に、最長共通部分列DP [N] [M]は、最終的な解決策であり、最長シーケンスを終了するSNはインクリメントされないので、最長の増加するシーケンスDP [N]は、最終的な解決策ではありません最長の増加サブシーケンスのシーケンス全体でなければならない、我々は最大のを見つけ、DP配列を反復処理する必要があります。

コード:

public int lengthOfLCS(int []nums1,int []nums2){
    int n1=nums1.length;
    int n2=nums2.length;
    int [][]dp=new int[n1+1][n2+1];
    for(int i=1;i<=n1;i++){
        for(int j=1;j<n2;j++){
            if(nums1[i]==nums2[j]){
                dp[i][j]=dp[i-1][j-1]+1;
            }else{
                dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
            }
        }
    }
    return dp[n1][n2];
}

おすすめ

転載: www.cnblogs.com/yjxyy/p/11119207.html