子樹合併揹包型別的dp的複雜度證明

2021-08-18 09:36:58 字數 1041 閱讀 7834

狀態形如f[

x][j

] f[x

][j]

表示x x

子樹內選了

j' role="presentation" style="position: relative;">j

j個,轉移形如f[

x][j

+k]=

∑f[x

][j]

∗f[y

][k]

f [x

][j+

k]=∑

f[x]

[j]∗

f[y]

[k

]假設樹上有n個點,第二維限制為k(最多選k個)

我們熟知,這樣dp複雜度上界是n^2的。因為合併大小為a,b的子樹複雜度是a*b,可以看成a子樹內任選一點,b子樹內任選一點進行匹配,不管怎麼合併任意兩個點只會在其lca匹配一次,所以是n^2的。

但是嚴格分析一下複雜度,可以得到更好的上界:o(nk)

首先,定義大小超過k的子樹為大子樹,小於k的為小子樹。

乙個極小的大子樹一定是由若干個極大的小子樹合併而成的,而且合併的過程中就會從極大的小子樹變成極小的大子樹。假設所有的極大的小子樹的大小分別為x1,x2,x3…..xm,顯然x1+x2+…+xm<=n,將這些小子樹併入大子樹的複雜度為k*(x1+x2+…+xm)<=nk,可以認為是每個極大的小子樹被消滅掉所產生的總時間代價不超過nk

考慮乙個極大的小子樹(大小x<=k)內部合併上來的複雜度,由上面的分析知是x^2的

因此每個小子樹內部合併的複雜度就是x1^2+x2^2+…+xm^2,xi<=k,顯然當盡量多的xi取到k這個值才會更大,因為假設∑x

i=n ∑xi

=n

為定值,x1>x2,如果讓x1++,x2–,上面那個值會變大。這樣複雜度就是n/k*k^2=nk

最後,考慮將所有的極小大子樹合併成整棵樹的複雜度,顯然極小的大子樹互不包含,因此極小的大子樹個數不會超過n/k個,而每合併兩個的時間開銷是k^2,因此這部分複雜度是n/k*k^2=nk

綜上,複雜度上界為o(nk)

樹上染色(樹上揹包dp 複雜度分析)

題幹 有一棵點數為 n 的樹,樹邊有邊權。給你乙個在 0 n 之內的正整數 k,你要在這棵樹中選擇 k 個點,將其染成黑色,並將其他的 n k 個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。問收益最大值是多少。題解 首先,看到黑點到黑點 白點與白點,其實這就...

01揹包問題 空間複雜度o V

題目 有n件物品和乙個容量為v的揹包。第i件物品的所需容量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。f i v 表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。現在我們來看第 件物品 如果選擇將第 件物品放入,那麼在放置前 件物品的時候應該空出 i 的容量,此時方程為...

演算法的複雜度 時間複雜度與空間複雜度

通常,對於乙個給定的演算法,我們要做 兩項分析。第一是從數學上證明演算法的正確性,這一步主要用到形式化證明的方法及相關推理模式,如迴圈不變式 數學歸納法等。而在證明演算法是正確的基礎上,第二步就是分析演算法的時間複雜度。演算法的時間複雜度反映了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很...