傳送門
難度提高+/省選-
該題是一道經典的樹形dp題目,基本就是樹形dp的板子題。
注意點的解釋參考:為什麼最後兩行要單獨拿出來做呢?
for(int i=s[x];i>=0;i–)
f[x][i+1]=f[x][i]+p[x];
我們回到題面上,父親是兒子的先修課,所以沒有父親時,兒子再多也沒有用,揹包中處理的子樹是不帶根結點的,我們要加上,否則會出現下面這種狀況:否則
如果在做的過程中將根結點算入子樹,那麼 f[1][2]最終值將會是 11 (在正確的過程中也是 11 ,但是會被更新到 f[1][3]),不做更新或再去做一遍更新就不對了,
#include
#include
#include
#include
using
namespace std;
const
int maxn =
305, maxm =
305;
int to[maxn]
, h[maxn]
, v[maxn]
, ne[maxn]
, idx;
int dp[maxn]
[maxm]
;int m, n;
int si, ki;
void
addedge
(int be,
int en)
void
dfs_dp
(int x)}}
for(
int i = m +
1; i >=1;
--i)
//填坑
dp[x]
[i]= dp[x]
[i -1]
+ v[x];}
intmain()
dfs_dp(0
);printf
("%d\n"
, dp[0]
[m +1]
);return0;
}
洛谷P2014 選課 樹形dp
給出n 300 n leq300 n 30 0個結點,每個結點都有乙個權值,然後一些結點必須只有選了前驅結點這個結點才可以被選。現在最多選m 300 m leq300 m 30 0個結點,求最大權值。實際上這個是乙個森林,但是通過設定乙個權值為0 00的虛點0 00,把所有的沒有前驅的點全部連到這個...
洛谷P2014 選課 樹形dp
在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有n門功課,每門課有個學分,每門課有一門或沒有直接先修課 若課程a是課程b的先修課即只有學完了課程a,才能學習課程b 乙個學生要從這些課程裡選擇m門...
樹形DP 洛谷P2014 選課
在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有n門功課,每門課有個學分,每門課有一門或沒有直接先修課 若課程a是課程b的先修課即只有學完了課程a,才能學習課程b 乙個學生要從這些課程裡選擇m門...