これは非常に大きな答えの 1 つです。エレガントなツーライナーが存在しても驚かないでしょうが、それが投稿されるまではここに私のものがあります.
単純な 2D グラフがあるとします。x 軸は解析ステップを表し、y 軸は現在の X と星の数 n(x)-n(*) の差を表します。たとえば、入力xx*xx**
の場合、グラフは次のようになります。
╫
╫ +
╫ + + +
╫ + + +
╬═╧═╧═╧═╧═╧═╧═╧
x x * x x * *
式が有効であるためには、このグラフが y 軸でゼロ以下に達してはならず、最後に y の値が 1 (スタックに残された単一の値) でなければなりません。
入力式で使用する 3 つの操作 (挿入、削除、置換) が与えられます。この置換操作は、実際には 2 つのうちの 1 つです。x を * に置換するか、* を x に置換します。式の途中で挿入または削除を適用すると、その時点以降、グラフ内のすべてのポイントが上下に移動するようにグラフが変更されます。置換が適用されると、ポイントはグラフ内の 2 つのノッチに対して上下に移動します。興味深いことに、削除操作を行う必要はありません。これは、反対の挿入を適用した場合と同じ結果が得られるためです。ただし、挿入は常に適用でき、シンボルが使用可能な場合にのみ削除されるという違いがあります。
あなたの目標は、操作の最小数を見つけることです。最終目標 (y=1) のみを観察する場合、グラフを移動し、できるだけ多くの置換操作を適用し、さらに 1 つの挿入操作を適用する必要があるノッチの数を決定します。N(x)-N(*) の合計が N の場合、操作の数は floor((N-1)/2) になります。記号は、どの操作が適用されるかを決定します。
問題は、もう 1 つの条件に注意を払わなければならないことです。つまり、グラフがゼロに到達してはならないということです。これを判断するには、まず前の操作を式に適用する必要があります。'insert x' が先頭に追加され、'insert *' が最後に追加され、先頭からすべての * を検索して x に置換し、すべての x を検索して末尾から * に置換します。
このステップの後、新しい表現が得られます。最初から繰り返し、y=0 の場所を探します。そのような場所がある場合は、その前に x を 1 つ挿入し、式の末尾に * を 1 つ挿入して補う必要があります。しかし、すでにそれを行っている可能性があることを思い出してください (先頭に x を挿入するか、末尾に * を挿入してください)。2 つの挿入 x がある場合は、実際には * を x に置き換えたふりをして (操作が 1 つ少なくなります)、x を挿入する必要があることを忘れてください。同様に、インサートのペア *: 2 つのインサート * を削除し、もう 1 つ 'replace x with *' を適用します。最後から検索したときに見つけた x が実際に現在の位置の前にある場合、置換を適用できず、2 つの挿入操作を 1 つの置換に圧縮できないため、実際にそれを適用する、つまり式を変更する必要があります。
最後まで反復を続け、追加の操作をカウントし、挿入 x が 1 つと挿入 * が 1 つあるかどうかを常に念頭に置いてください。それだけです。最後に、いくつかの操作があります。