樹形dp的主要思路
樹形揹包:與我們考普及組時寫的揹包dp相似,枚舉前i個物品,一共有j的容量可以取得的最優值。但是,這裏揹包的容量是不固定的,所以我們要加一維來枚舉揹包的容量。但是注意,這裏還是二維數組,我們通過本質上類似於滾動數組的方式來進行推導。因爲是從j-k推到j,所以我們一定要對循環逆序(不然就不是用i-1更新i了)
大概就是這樣。。。
一些例題(註釋裏是要注意的細節)
選課:https://www.luogu.org/problemnew/show/P2014
1.數組設定:要選的課的總數是answer,第一維是以x爲根的子樹,第二維是到此爲止一共選了j個課
2.特殊限值:如果選了兒子,必須要選爸爸(先修課程),所以爸爸這個揹包是強制要選的(j循環從1開始)
3.注意點:因爲根節點0是虛擬節點,所以要選修的課程實際上有m+1個。
重建道路:https://www.luogu.org/problemnew/show/P1272
1.思路:不如找割剩下來的子樹。枚舉節點們的lca,找總數是p的子樹
2.數組設定同上
3.特殊限值其實也一樣(因爲你要是不選lca就不是一棵子樹了)
4.別的還好。。。