P1273 有線電視網 樹形DP 樹上揹包

2022-06-12 21:21:08 字數 1107 閱讀 9982

給定一顆有根樹,要求選擇最多的葉子結點,並且使得達到這些葉子結點的花費(可以理解成到葉子的路徑權值和) 小於等於選擇的葉子結點的點權和。

\[2\leq n\leq 3000\\

1\leq m \leq n - 1

\]經典的樹上揹包問題。

可以對一些葉子結點進行選或者不選的決策

以下參考洛谷yqw2486的題解

狀態轉移方程

\[dp[i][u][j] = max(dp[i - 1][u][j - k] + dp[v的總兒子數][v][k] - w(u,v))

\]\(dp[i][u][j]\)表示以\(u\)為根的子樹的前\(i\)棵子樹中選擇\(j\)個節點能夠獲得的最大費用

邊界\[dp[u][1] = w[u]\\

dp[u][0] = 0

\]顯然我們可以類似01揹包的辦法滾動一維

\[dp[u][j] = max(dp[u][j-k] + dp[v][k] - w(u,v))

\]

struct edge 

};vectore[3005];

int w[3005];

int dp[3005][3005];

int n, m;

int dfs(int u)

dp[u][0] = 0;

int siz = 0;

for (auto v : e[u])

return siz;

}int main()

}for (int i = n - m + 1; i <= n; i++)

w[i] = readint();

for (int i = 0; i < 3005; i++)

for (int j = 0; j < 3005; j++)

dp[i][j] = -1e9;

for (int i = 0; i < 3005; i++)

dp[0][i] = 0;

dfs(1);

for (int i = m; i >= 0; i--)

if (dp[1][i] >= 0)

}

P1273 有線電視網(樹上dp)

某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。現在每個使用者都準備...

題解 P1273 有線電視網

這題顯然是個樹形dp之樹上分組揹包,信心滿滿地寫出轉移方程後,發現 時間複雜度 o n 3 但仔細觀察了討論區和題解後,發現,這是 o n 2 的?於是我開始嘗試牙刷圖 分塊牙刷圖 菊花圖 掃帚圖。卡標算。燃鵝失敗了。證明 暫且先認為所有節點都會產生貢獻,這不會影響最壞複雜。考慮一下最裡面迴圈的過程...

P1273 有線電視網(樹形dp 分組揹包)

原題 題意 一棵樹,節點1為根,邊權為花費。到達乙個葉子節點會得一分,並且還給你花費fee ifee i feei 問不花錢可以得到的最高分。解析 首先是樹形dp,第二維因為得分和金額中,得分在值上比較小,所以dp p v 表示到點p 從下到上 得到v分的最大剩餘金額。顯然,到每乙個點,對於每個v都...