原題:
題意:
一棵樹,節點1為根,邊權為花費。到達乙個葉子節點會得一分,並且還給你花費fee
ifee_i
feei
。問不花錢可以得到的最高分。
解析:
首先是樹形dp,第二維因為得分和金額中,得分在值上比較小,所以dp[p][v]表示到點p(從下到上)得到v分的最大剩餘金額。
顯然,到每乙個點,對於每個v都有乙個值。那麼從很多個兒子更新到父親,這個dp怎麼維護呢?
其實很簡單,因為乙個兒子對得分的貢獻只有一種情況,所以對乙個兒子的所有狀態,做一遍分組揹包,最後就維護好父親的狀態了。
分組包的迴圈順序:組之間、包大小從大到小、組內,這樣保證每一次更新不會從同組或自己的狀態轉移過來。
#include
using namespace std;
#define pill pair
vectorv[
3001];
int fee[
3001];
int dp[
3001][
3001
], max[
3001];
// 記錄每個點的最大分數,優化時間
int tmp[
3001];
void
dfs(
int p)
int maxs =0;
dp[p][0
]=0;
for(
int i =
0; i < v[p]
.size()
; i++)}
maxs +
= max[u];}
max[p]
= maxs;
}int
main()
}for
(int i =
1; i <= n - m; i++))
;}}for
(int i =
1; i <= m; i++
)scanf
("%d"
, fee +
(n - m + i));
dfs(1)
;for
(int i = max[1]
; i >=
0; i--
)}
P1273 有線電視網(樹上dp)
某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。現在每個使用者都準備...
題解 P1273 有線電視網
這題顯然是個樹形dp之樹上分組揹包,信心滿滿地寫出轉移方程後,發現 時間複雜度 o n 3 但仔細觀察了討論區和題解後,發現,這是 o n 2 的?於是我開始嘗試牙刷圖 分塊牙刷圖 菊花圖 掃帚圖。卡標算。燃鵝失敗了。證明 暫且先認為所有節點都會產生貢獻,這不會影響最壞複雜。考慮一下最裡面迴圈的過程...
P1273 有線電視網 樹形DP 樹上揹包
給定一顆有根樹,要求選擇最多的葉子結點,並且使得達到這些葉子結點的花費 可以理解成到葉子的路徑權值和 小於等於選擇的葉子結點的點權和。2 leq n leq 3000 1 leq m leq n 1 經典的樹上揹包問題。可以對一些葉子結點進行選或者不選的決策 以下參考洛谷yqw2486的題解 狀態轉...