共通部分ジム - 2019 ICPC国立大学・デ・コロンビアのプログラミングコンテストCDJ序列102307C公共

2019国立大学コロンビアのICPCプログラミングコンテストCDJ

 

C.共通部分

問題の意味は:長さnの二つの文字列は> = 150 * nは、2つの兄弟文字列をlenの場合は最長共通部分列lenが、それ以外ではない2つの文字列を見つけ、与えられています。

ソリューション:LCS時間の複雑さは、単純なO(nm)で検索し、このタイトルは確かにタイムアウトです。正の解は、この機能の150を注意することは、考えることは容易ではない、我々はそれを開始することができます* 0.01を放棄し、N =この機能から1000の文字され、

その後、我々はDP [i] [j]は、一連iはDPを+フロントで設定する[I] [J]の文字は、i番目の文字、元の文字列のB jの+ DP jの文字を破棄[I] [J]の文字を廃棄しました。 LCS長はDP [I] [J]が得られます。

次に[I] [j]をDPする列挙この場合、私はDPを+ [I] [j]は、文字列マッチングが完了した、J + DPである[I] [j]は、文字列Bに一致完了する次のAB列の先頭の位置が決定された他の言葉で、我々は一致するように、次の文字の先頭から続けています。

DPの後に[i] [j]が完成一致し、Aは、[私はDPを+ [I] [J] +1]とB [J + DP [I] [J] +1]等しくない場合、2つのだけの代替破棄[iがDPを+ I] [J] +1]またはB破棄[J + DPを[I] [J] +1]。したがって、使用DP [I] [J]これら2つの値を更新します

 

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
CONSTの INT N = 1E5 + 10 チャーA [N]、B [N]。
INTの N、M、ANS、DP [ 1010 ] [ 1010 ]。

INT メイン()
{ 
    scanf関数(" %sの%sの"、A + 1、B + 1 )。
    N = STRLEN(A + 1 )。
    M =分(1000年、N)。
    以下のためにint型 = Iを0 ; I <= M; I ++ のためのINT J =0 ; J <= Mであり、j ++ ){
             ながら([iはDPを+ [I] [J] + 1 ] == B [J + DP [I] [J] + 1 ] && iはDPを+ [I] [ J] + 1 <= N && J + DP [I] [J] + 1 <= N)DP [I] [J] ++ ; 
            DP [I + 1 ] [J] = MAX(DP [I + 1 ] [j]は、DP [I] [J])。
            DP [I]、[J + 1 ] = MAX(DP [I]、[J + 1 ]、DP [I] [J])。
            ANS = MAX(ANS、DP [I] [J])。
        } 
    であれば100 * ANS> = 99 * n)でプット(" 長い間失われ兄弟D:")。プット(" 未兄弟:( " );
     の戻り 0 ; 
}

 

C.共通部分

問題の意味は:長さnの二つの文字列は> = 150 * nは、2つの兄弟文字列をlenの場合は最長共通部分列lenが、それ以外ではない2つの文字列を見つけ、与えられています。

ソリューション:LCS時間の複雑さは、単純なO(nm)で検索し、このタイトルは確かにタイムアウトです。正の解は、この機能の150を注意することは、考えることは容易ではない、我々はそれを開始することができます* 0.01を放棄し、N =この機能から1000の文字され、

その後、我々はDP [i] [j]は、一連iはDPを+フロントで設定する[I] [J]の文字は、i番目の文字、元の文字列のB jの+ DP jの文字を破棄[I] [J]の文字を廃棄しました。 LCS長はDP [I] [J]が得られます。

次に[I] [j]をDPする列挙この場合、私はDPを+ [I] [j]は、文字列マッチングが完了した、J + DPである[I] [j]は、文字列Bに一致完了する次のAB列の先頭の位置が決定された他の言葉で、我々は一致するように、次の文字の先頭から続けています。

DPの後に[i] [j]が完成一致し、Aは、[私はDPを+ [I] [J] +1]とB [J + DP [I] [J] +1]等しくない場合、2つのだけの代替破棄[iがDPを+ I] [J] +1]またはB破棄[J + DPを[I] [J] +1]。したがって、使用DP [I] [J]これら2つの値を更新します

 

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
CONSTの INT N = 1E5 + 10 チャーA [N]、B [N]。
INTの N、M、ANS、DP [ 1010 ] [ 1010 ]。

INT メイン()
{ 
    scanf関数(" %sの%sの"、A + 1、B + 1 )。
    N = STRLEN(A + 1 )。
    M =分(1000年、N)。
    以下のためにint型 = Iを0 ; I <= M; I ++ のためのINT J =0 ; J <= Mであり、j ++ ){
             ながら([iはDPを+ [I] [J] + 1 ] == B [J + DP [I] [J] + 1 ] && iはDPを+ [I] [ J] + 1 <= N && J + DP [I] [J] + 1 <= N)DP [I] [J] ++ ; 
            DP [I + 1 ] [J] = MAX(DP [I + 1 ] [j]は、DP [I] [J])。
            DP [I]、[J + 1 ] = MAX(DP [I]、[J + 1 ]、DP [I] [J])。
            ANS = MAX(ANS、DP [I] [J])。
        } 
    であれば100 * ANS> = 99 * n)でプット(" 長い間失われ兄弟D:")。プット(" 未兄弟:( " );
     の戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/downrainsun/p/11518754.html