CCF 201909 5 城市規劃 樹形dp

2021-10-01 06:14:21 字數 1563 閱讀 8760

題目鏈結;

題目大意:

思路: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...