木変形パズル

基本的には,構文解析と探索を行う問題である. 入力として与えられる算術式の構文は一般のものより単純なので,以下では,探索のパートに関する解説を行う.

この問題で,ナイーブな探索を行うと計算量が爆発する. まずは,2 種類の操作を繰り返し適用することで,与えられた算術式に対応する木から,どのような木が生成できるかを把握することが大事である. 以下のような考察を行うと,葉以外のノードが根ノードとなるすべての木を考え,それらの木が表現する算術式の値の最大値を求めれば良いことがわかる.

根ノードを一つ固定して兄弟ノード間の左右の関係を自由に入れ替えたとき,各ノードが取りうる値の最大値と最小値は次のような考え方で求めることができる.

メモ化や動的計画法を用いて同じ計算を 1 回しか行わないようにすれば,葉以外のノード数をN としたときの計算量は O(N ) になる. これを,N 個の葉以外のノードそれぞれを根ノードとして繰り返せば,全体の最大値を求めることができる. 単純に考えると全体の計算量は O(N2) になりそうだが,同じ計算の繰り返しが多いため,メモ化や動的計画法により,全体の計算量も O(N ) に抑えることができる.