Gravatar
遥时_彼方
积分:703
提交:130 / 410

题目要求共有n个结点,将其中k个点染成黑色(本题解中为了方便描述,通称所有未染色的点为白点),求黑点两两距离及白点两两距离,使他们之和最大。

我们可以将距离转化为路径,然后再将路径拆分成边,就可以记录每条边被经过的次数,直接计算即可。

问题来了!:那么每条边会对答案贡献多少呢?

我们不妨设这条边的一侧共有w个点,其中有t个点被染成黑色了;

那么这一侧共有t个黑点,(w-t)个白点;类似,另一侧有(k-t)个黑点,(n-w-k+t)个白点;

令sz为这条边的边权,那么贡献就是val=sz*(t*(k-t)+(w-t)*(n-w-k+t));

解题的大致思路就是计算每条边对答案的贡献,最后利用状态转移方程求出最优解。

首先给出状态数组:f[x][y];

f[x][y]表示给以x为根结点的子树染上y个点所得的对于整棵树的最大贡献;


方程如下:

f[i][j]=max(f[i][j],f[i][j-t]+f[z][t]+val);(z表示i的子结点)

目标状态:f[1][k];

最后附上代码

PS:中间可能遇到非法情况,建议把f[x][y]预处理成非法情况,方便跳过处理(代码最后有针对这点的样例,可自行调试);

强烈建议参考代码理解!!!!!

Over.

(第一次写题解,不足之处请大家多多包涵》_《)



题目1962  [HAOI 2015]树上染色 AAAAAAAAAA      5      评论
2022-03-01 19:52:22