次のように内容は次のとおりです。
ビデオゲームフォールアウト4では、クエスト「自由への道」は「フリーダムトレイルリング」と呼ばれる金属製の文字盤に到達し、扉を開くために、特定のキーワードのスペルをダイヤルを使用するプレーヤーが必要です。
外輪と綴られるキーワードニーズを表し、別の文字列キー、に刻まれたコードを表す文字列のリングを、与えられました。あなたは、キーワード内のすべての文字を綴るために、ステップの最小数を見つける必要があります。
最初は、リングの最初の文字は、午前12時の方向に整列されます。あなたは中央のボタンを押して、その後12時の方向に整列し、文字列のキーの各文字を作るためにリングを時計回りや反時計回りに回転させることにより、いずれかによって、文字列のキー1内のすべての文字をスペルする必要があります。
[I]をキーの文字キーを綴るためにリングを回転させる段階では:
- あなたは1つのステップとしてリングを時計回りや反時計回り一箇所、カウントを回転させることができます。回転の最終的な目的は、この文字は文字キー[I]に等しくなければならない12時00分方向に列リングの文字のいずれかを整列することです。
- 文字キー、[I]は、午前12時の方向に整列されている場合は、1つのステップとしてカウントされ、スペルを中央のボタンを押す必要があります。押した後、あなたはそれ以外の場合は、あなたがすべてのスペルを終え、キー(次の段階)の次の文字を綴るために始めることができます。
例:
入力:リング=「godding」、キー=「GD」 出力:4 説明: それは場所にすでにあるので、最初のキー文字「G」の場合は、私たちはこの文字のスペルを1ステップを必要としています。 2番目のキー文字「D」のために、我々はそれが「ddinggo」になるようするために、2つのステップで反時計回りに「godding」リングを回転させる必要があります。 また、私たちは綴りのための1以上のステップを必要としています。 だから、最終的な出力は4です。注意:
- リングとキーの両方の長さが100の範囲1であろう。
- そこ両方の文字列で小文字は唯一であり、両方の文字列でいくつかのduplcate文字かもしれません。
- 文字列のキーは常に文字列のリングを回転させることによって綴らすることができることを保証しています。
ソリューションの概要:リングがそこ[J] = [I] DP、必要に応じたキー操作のj番目の文字の最小数のi番目の文字であることをDP [I] [j]をいう分(DP [K ] [J-1] +距離 (I、K))、kはリングとキーを表す[J-1]の文字に対応し、距離は、(i、k)の環として、iおよびkの最短距離環を表しそしてキー[J-1]複数の文字に対応する最小要求ので、有していてもよいです。最後に、長い環はいずれ分(DP [M] [ - M、と仮定すると、同じ文字の最後の文字を持つすべてのキーを見つけるに限り 1]) の最小値。
コードは以下の通りであります:
クラスのソリューション(オブジェクト): デフfindRotateSteps(自己、リング、キー): "" " :タイプリング:STR :タイプのキー:STR :RTYPE:int型 """ DP = [[フロート(' INF ')] * lenは(キー)用 _ におけるリング] のための I における範囲(LEN(リング)): もしリング[I] == キー[0]: DP [I] [0] =分(I、lenの(環) - I)+ 1 用 J における範囲(1 、(キー)LEN): のために私に範囲((リング)LEN): もしキー[J] == 環[I]: のための K における範囲(LEN(リング)): #iが== kの場合:続ける 場合は環[K] ==キー[J- 1 ]: 差分 = ABS(K - I) DP [I] [J] =分(DP [I]、[J]、DP [K] [J-1] +分(差分、lenの(環) -差分) + 1 ) RES =フロート(' INF ' ) のための I における範囲(LEN(リング)): もしリング[I] ==キー[-1 ]: のためにJ における範囲(LEN(DP [I])): RES =分(RES、DP [I] [ - 1 ]) 戻り RES