一句話題意:一棵樹,一共n個點,每個點上有乙個權值,求從1出發,走k步,最多能遍歷到的權值。可以往回走。
第一(二)道樹上揹包題,先是看了dalao的題解,改了一點就過樣例了。然而....tle??? 改了挺久發現由於多組資料且沒有「0 0」的輸入,如果不在讀入的時候加「~」或「eof」就會死迴圈,從而導致tle。
狀態設計:設f[i][j][0/1]為以i為根的子樹上,走j步,能得到的最大權值(0/1的表示會在轉移方程中描述) 考慮:(此處參考dalao@zubizakeli ,侵刪qwq)每個節點在最終答案中的型別:1,不經過;2,經過但不返回;3,經過且返回 (返回的定義是最終的停止節點不位於該節點的子樹中) 那麼可以進行轉移:
之後便是一些細節問題:給陣列賦初值(從0開始!走0步),更新head陣列。
實現還是比較簡單的啦。
code
1 #include2 #include3 #include4view code5using
namespace
std;67
intn,k,tot;
8int w[300],head[300];9
int f[300][200][3
]; 10
struct
nodeedge[300
];13
14void add(int x,int
y)15
2021
void read(int &x)
2230
31void treedp(int u,int
fa)3246}
47}4849
void
init()50
5556
intmain()
5767 treedp(1,-1
);68 printf("
%d\n
",max(f[1][k][0],f[1][k][1
]));
69init();70}
71return0;
72 }
小結:分類討論常常也是解題重要的突破口吶。
poj2486 Apple Tree 樹形dp揹包
題意 由n個結點組成的樹,每個結點有個點權,你從結點1出發,問最多走m步可以獲得點權和 重複走乙個結點只有第一次走過會 獲得點權值 的最大值。思路 設dp i j k 表示從i結點走j步 k 0表示回到i結點共j步,k 1表示j步之後不回到i節點 可獲得點權和的最大值。考慮當前的結點u,以及它的子結...
poj 2486 (樹形dp (好題))
最近做了些樹形dp的題目,感覺對這種將每棵子樹都當做乙個物品處理的樹形揹包題目理解還不夠深刻,果然這題就被破的很慘,但好在想了很長時間想清楚了,這題就是求從一顆帶點權樹的根節點出發,走過k條邊能獲得的最大權值。考慮某乙個節點u,肯定有一維狀態表示從該節點開始還可以走多少條邊,但最優決策有可能是從u的...
樹上揹包 POJ2486 Apple Tree
一棵樹n 100 個節點,每個節點有a i 個蘋果,從1出發走k 200 步,問最多能得到多少個蘋果。首先想到每個節點只有3種情況,要麼不經過,要麼經過了最後回來,要麼經過了最後不回來,只用關心後兩種就行。於是可以想到乙個dp i j k 表示從i出發走j步,k 0表示回來,k 1表示不回來,現在想...