u
にサブツリーされたツリー内の長さがk
であり、パス内にu
という名前のルート指定パスの別個の(共通の頂点がない)最大数として定義します。
また、任意の経路でu
NOTとu
にルート付きツリーサブにおける長k
のルート指向経路の別個の最大数(NO共通の頂点)としてDP_out(u,k)
を定義します。
私はまずDP_out(u,k)
を処理します。 u
がいずれのパスにも含まれていない場合、長さk
の最大ルート指向パスが、いずれかの子ルートにu
のルートである必要があります。だから私たちは持っています:
DP_out(u,k)=Sum i=1 to r [max(DP_in(v_i, k-1), DP_out(v_i, k)) ]
ここで、v_1, ..., v_r
はu
の子です。 DP_in(u,k)
用として今
、u
は1、その後、パスであり、かつ唯一、u
の子供のはu
を含むパスでなければならないからです。したがって、我々は持っている:r
は、あなたのツリーのルートノードである場合
DP_in(u,k)= max (DP_in(v_i, k-1)+ Sum j=1 to r, j=/=i [max(DP_in(v_j, k-1), DP_out(v_j, k))])
i=1,...,r.
以上を、そしてあなたが望む答えは、実際
max(DP_in(r,k), DP_out(r,k))
です。
ツリーの最下部(葉)から同時にDPテーブルを作成して、テーブルを塗りつぶす順番が正しいことを確認できます。
我々はO(n^2)
サブ問題があることを知っており、DP_in(u,k)
の各部分問題は単純O(n^2)
で計算することができるがDP_out(u,k)
の各部分問題はO(n)
に計算することができます。したがって、最悪のケースの合計はO(n^4)
です。
私の方法が最も最適な方法であると主張しているわけではないことに注意してください。若干最適化された方法(DSを使用します)が多分ありますが、興味があれば追求してくださいその中に。
ありがとうございます。 –
あなたの停止条件はなんですか?葉?その高さのノードはkより小さいか? –
@ OriNetanelBen-Zaken高さが$ k $未満のノードは、その場合には長さkのパスが存在しないため、0を返します。 – AspiringMat