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 ; }