は、(多くの)動的なプログラミングを必要としない、この1のための素晴らしい解決策があります。
A
|
B
/\
C D
|
E
葉A
のための計算、C
とE
非常に簡単です:ちょうどn=5
ノードとの例を取ることができます。これらは、このノードで開始または終了するパスにのみ表示されます。パスA
の開始と終了がA
で終わっているため、2*n
で2回カウントされるので、2n - 1 = 9
のパスがあります(-1
)。
内側のノードでは、もう少し面倒です。最初にノードD
を見てみましょう。もちろんD
は、すべてのパスに表示されます。開始または終了はD
です。だから我々は再び2n - 1 = 9
パスを持っています。しかし、現在では、D
がパスの途中に表示される場合もあります。例えば。パスA-B-D-E
にあります。これは、パスがサブツリーABC
のどこかで始まりサブツリーE
またはその反対に終わる場合にのみ発生します。コンビナトリアルは、size(ABC)*size(E) + size(E)*size(ABC) = 2*size(ABC)*size(E) = 2*3*1 = 6
がたくさんあることを私たちに伝えています。したがってD
は正確に9 + 6 = 15
パスに現れます。
ノードB
の場合、それはやや難解です。再度B
から始まるまたは終わる、2n - 1 = 9
のパスがあります(これは各ノードに当てはまります)。しかし、やはりB
はパスの途中に現れることがあります。このためには、サブツリーA
,C
またはDE
のいずれかで始まり、別のパスで終了する必要があります。したがって、可能なパスは2*size(A)*size(C) + 2*size(C)*size(DE) + 2*size(DE)*size(A) = 2*1*1 + 2*1*2 + 2*2*1 = 2 + 4 + 4 = 10
です。数学を少しすれば、これは(n-1)^2 - size(A)^2 - size(C)^2 - size(DE)^2
と同じであることがわかります。したがって、合計でノードは9 + 10 = 19
パスに現れます。
そして、計算したい値は9*value(A) + 19*value(B) + 9*value(C) + 15*value(D) + 9*value(E)
です。
深さ優先検索では、すべてのサブツリーのサイズを動的プログラミングで計算し、2つの公式を使用して各ノードの外観数を計算することができます。