題意:
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