题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561
思路:树dp,设dp(i,j)为i节点时要攻破k个城堡可获得的最大收益(包括i节点,即i节点也要消耗k个城堡中的一个),我们考虑攻破的这k个城堡应当包括哪些部分:
假如节点i有一个儿子,则这k个城堡一定来自它的儿子已经它儿子的儿子;假如它有p个儿子,则可能来自于p个儿子中的q个儿子,这样子问题就找到了。
设当前节点为u,攻破j个城堡的最大收益为dp(u,j),其中有k个城堡是从u的直接儿子获得的,则有j-k个是从儿子的儿子获得的,则就变成了熟知的01背包,表达为:
dp[u][j] = max(dp[u][j], dp[u][k]+dp[v][j-k]),注意如果u是虚根的话是不可以算入花费的。所以当u=0的时候我们相当于求从k+1个城堡中获得收益。
1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛┗┛┃ 9 ┓┏┓┏┓┃ 10 ┛┗┛┗┛┃ 11 ┓┏┓┏┓┃ 12 ┛┗┛┗┛┃ 13 ┓┏┓┏┓┃ 14 ┃┃┃┃┃┃ 15 ┻┻┻┻┻┻ 16 */ 17 #include 18 #include 19 #include 20 #include 21 #include 22 #include 23 #include 24 #include 25 #include 26 #include 27 #include 28 #include 29 #include 30 #include 31 #include 32 #include 33 #include