題目鏈結;
題目大意:
思路:u是v的直連父親,先往下搜,向上回溯時,
列舉邊計算貢獻,即u和v之間邊w,v裡面選了p個,則all-v這一塊選k-p個
邊w被經過p*(k-p)次,
實際轉移時,考慮v裡取了p個,u在已經搜過的子樹里取了q個,
以此來更新dp[u][p+q]的值
dp[u][p]表示在u這棵子樹(含u)裡選了p個點的最小代價
具體實現時,應考慮p+q<=k,
用加法p+q比用減法p-q快,但考慮更新順序,故用輔助陣列
為什麼用輔助陣列?,因為
從大到小更新可以解決這個問題,或者用輔助陣列。再結束後再更新。
#include
#define ll long long
const ll inf=
0x3f3f3f3f3f3f3f3fll
;using
namespace std;
struct node
;vector v[
50005];
int s[
50005]=
;ll num[
50005]=
;ll f[
50005][
105]
=, t[
105]
;int n, m, k;
void
dfs(
int u,
int fa)
for(
int r=
0; r
.size()
; r++
)for
(int i=
0; i<=mn; i++)}
for(
int i=
0; i<=sum; i++
) num[u]
+=num[to];}
}}intmain()
memset
(f, inf,
sizeof
(f))
;//cout
(int i=
1; i<=n-
1; i++))
; v[to]
.push_back
(node);
}dfs(1
,-1)
;printf
("%lld\n"
, f[1]
[k])
;return0;
}/*5 3 2
1 3 5
1 2 4
1 3 5
1 4 3
5 4 1
4*/
CCF 2019 城市規劃(樹形dp,貢獻)
比較容易想到的一種做法是 設dp i j 表示 i 為根,選 j 個點的答案。在子樹合併時,枚舉子樹選取的點的個數和當前選取的結點個數,加上統計當前這條邊對答案的貢獻更新。轉移式子為 dp u i j min dp u i j dp u i dp v j i j w 一跑會發現樣例都過不了,原因是這...
城市規劃道路樹1 3 1版
使用方法 選擇所要合併的樹物件,執行指令碼 說明 將隨機樹高度的指令碼寫到了合併樹的函式中 並且在第一次執行合併樹的指令碼時 執行隨機樹高度的操作 而接下來的合併樹操作中 不再執行 有效的提高了效率 經過測試合併1萬個物件 可以在三分鐘左右完成 因為還不知道maxscript中的time如何操作 沒...
bzoj 3456 城市規劃
題意 求n個點的無向連通圖個數 n個點不同,答案對1004535809取模 n 130000 題解 生成函式的種種神奇應用 不過這玩意真是越來越不oi了 笑 這道題首先考慮遞推公式 設f x 為結點數為x的答案 那麼用總的無向圖數減去不連通的無向圖數目就是答案 f i 2 i i 1 2 f j 2...