#2071. 「JSOI2016」最佳团体

口胡是要付出代价的。

\(01\)分数规划不能直接套板子了,窝一开始想着用什么简单的方法缩点(每个点只有一个入度啊)然后跑拓扑图求解,似乎还可以通过牛顿迭代减少运算次数,很正确的样子(乱搞也行不通!),问题是这样还要考虑人数,可不可做都不知道。转念一想,既然每个点只有一个入度,那么环从\(0\)号点\(jyy(orz)\)开始是肯定无法到达的(无法从任何一个点进入环)。题目没说不可行就一定是可行的(雾),直接从\(0\)号点遍历即可,自然而然的拓扑图且还有个容易操作的性质,任意两条路不会汇合,理由如上,路只能分散,这不就是颗树吗?窝继续想着拆分出来跑背包加判重,写完后发现公共部分无法处理,自闭\(.jpg\)

那肿么办啊,把两个思路结合起来,依旧在树上做,同时利用动态规划的思想:树形\(DP\)先二分出分数,保存贡献而不是分数,然后就容易转移了。有以下两种思路:

\(1.\)主动转移,借助时间戳概念来解决。\(f[i][j]\)表示到\(i\)的时间戳为止,取了\(j\)个人的最大贡献,发现从根结点到\(i\)时间戳的结点一定是都选取的。转移分两种情况,转移到儿子以及转移到下一棵不被当前子树包含的子树,因为这个子树一定与从根结点到\(i\)时间戳的结点这一段链有连边(两者结合有了充分性),预先\(dfs\)记录一下。

\(f[i+1][j+1]=max(f[i+1][j+1],f[i][j]+con[i]);\)

\(f[next[i]][j]=max(f[next[i]][j],f[i][j]);\)

\(2.\)被动转移,树上背包,\(f[i][j]\)表示以\(i\)号点为根的子树中取了\(j\)个点的最大贡献。强制选当前点,枚举儿子和子树大小。因为边与点的数量规模相同,所以是\(n^2\)的。

\(O(n^2)\)

问题来了,这题如果加强一下,每个候选人可能需要好多人推荐还能做吗?

你可能感兴趣的:(#2071. 「JSOI2016」最佳团体)