首页 > 代码库 > POJ 1155 (树形DP+背包)
POJ 1155 (树形DP+背包)
题目链接: http://poj.org/problem?id=1155
题目大意:电视台转播节目。对于每个根,其子结点可能是用户,也可能是中转站。如果是中转站则花钱,如果是用户,则收钱。问在不亏本的前提下最多能有多少个用户看到节目。
解题思路:
树形背包。cost=1。
且有个虚根0,取这个虚根也要cost,所以最后的结果是dp[0][m+1]。
本题是cost=1的特殊背包问题,在两个for循环上有一个优化。
for(f+1...j....cost)
for(1....k...j-cost)
其中f为当前已经dfs子结点个数。之所以+1,是因为根要预留一个空间。
f+=dfs(t),dfs(t)返回的是子点t的f+1。
其实可以直接把f+1写成m+1, 不过要多跑几次循环。
这种写法在POJ 1155中对于子结点不完全取将会起到很大作用。
POJ 1155 (树形DP+背包)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。