题意:
n(2000)个点的树 从中选出k(50)个点 要求 选出的点中等概率选出两个点 使得这两点的期望值最小 输出期望值乘k^2
思路:
我们将题目的要求化简 sum( sum( dis(i,j) ) ) / k^2 * k^2 其实就是求 sum( sum( dis(i,j) ) ) 其中i和j为任意选出的k个点
设dp[i][k]表示扫描完i为根的子树选出k个点的最小sum
那么转移方程就是 dp[father][k1+k2] = min( dp[father][k1]+dp[son][k2]+edge*k2*(k-k2)*2 ) 这个方程很好理解 注意式中的k2 我们利用它计算的原因是 son树内之选k2个点
代码书写的时候还要注意 dp过程中k1需要倒着for 这个做过01背包应该很好理解
代码:
#include
#include
#include
#include
#include
#include