bzoj1017[JSOI2008]魔兽地图DotR

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1017[JSOI2008]魔兽地图DotR相关的知识,希望对你有一定的参考价值。

先占一个坑。

题解写好了,代码不想写。。

bzoj 1017 dp推导,没有代码。(我才不会告诉你是我代码不会写呢)
首先我们可以发现这是一道树形dp
但是不同于平常的树形dp 这是由儿子节点合并到父节点。
设f[i][j][k]表示以i为根的子树贡献j个到他的父亲节点,花费k所能获得的最大的power
我们可以分成两种状态。
i是叶子节点:f[i][j][k*cost[i]]=(k-j)*power([i]);
k*cost[i]表示的是在这个点选k个,这个点获得的power不包括给予他父亲的就是后半部分。
i不是叶子节点:
这个转移就比较的奇怪了。
我们需要设一个中间的数组g[i][j]
表示以x为根的子树中前i个节点花费j所能获得的最大power
于是g[cnt][j]=max{g[cnt-1][k]+f[x‘son][l*res][j-k]};
这个地方非常不好理解。
··········分割线(解释)··············
cnt是枚举的变量,表示的是我们已经枚举到第几个点了。
首先我们从大到小枚举l,表示x这个点买l个,
g[cnt-1][k]表示的是前面的状态
f[x‘son][l*res][j-k]中res表示的是这个点的可以购买的剩余的数量,[j-k]就是两个的差分值啦
··········end···············
我们根据这个g就可以进一步推导f
f[x][j][k]=max{g[size[x]][k]+(l-j)*power[x]};
注:花费价格是一样的,合成不需要花费。
于是最后对每一个根节点跑一边ans数组就可以了,方法和上面一样。
ans[cnt][j]=max{ans[cnt-1][k]+f[x][tmp(0<=tmp<=limit[x])][j-k]};

 

以上是关于bzoj1017[JSOI2008]魔兽地图DotR的主要内容,如果未能解决你的问题,请参考以下文章

[BZOJ1017][JSOI2008]魔兽地图DotR 树形dp

bzoj 1017: [JSOI2008]魔兽地图DotR

bzoj1017: [JSOI2008]魔兽地图DotR

[bzoj1017]: [JSOI2008]魔兽地图DotR

[BZOJ 1017][JSOI2008]魔兽地图DotR(树形Dp)

bzoj1017[JSOI2008]魔兽地图DotR