樹形dp 組合數學 藍魔法師

2021-10-25 01:34:51 字數 1449 閱讀 3562

dp[i][j]表示對於i這個子樹來說,i所在的連通塊大小為j,並且整棵樹合法的方案數。

接下來就是類似揹包的解法了。遍歷每個兒子的分支,每個分支要麼刪除,要麼不刪除。

1.刪除:

刪除此邊,那麼就意味著當前以u節點連通塊大小為k的方案數 都可以 乘 v節點連通塊大小所有的方案數:

2.不刪除

不刪除就相當於合併那麼此時直接跑兩個迴圈即可:

for(int i=1;i<=min(sz[u]*1ll,m);i++)}}

考慮到和dp[u][k]的狀態有關,所以用tmp陣列先預初儲存一下!

#include

using

namespace std;

typedef

long

long ll;

//三年競賽一場空,不開long long見祖宗

//typedef __int128 lll;

#define print(i) cout << "debug: " << i << endl

#define close() ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)

#define mem(a, b) memset(a, b, sizeof(a))

#define pb(a) push_back(a)

#define x first

#define y second

typedef pair<

int,

int> par;

const ll mod =

998244353

;const

int maxn =

2e3+10;

const

int inf =

0x3f3f3f3f

;ll n, k;

vector<

int> g[maxn]

;ll dp[maxn]

[maxn]

, tmp[maxn]

;ll siz[maxn]

;void

dfs(

int u,

int fa)

}int

main()

dfs(1,

-1);

ll res =0;

for(

int i =

1; i <= k; i++

) res =

(res + dp[1]

[i])

% mod;

cout << res << endl;

}

藍魔法師 樹形DP

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 你,你認錯人了。我真的,真的不是食人魔。藍魔法師 給出一棵樹,求有多少種刪邊方案,使得刪後的圖每個連通塊大小小於等於k,兩種方案不同當且僅當存在一條邊在乙個方案中被...

Wannafly27 C 藍魔法師 樹形DP

wannafly27 c 藍魔法師 給定一棵樹,刪除一些邊,使每個連通塊不超過k個節點 includeusing namespace std const int max 2e3 5 const int mod 998244353 int n,k struct p e max 1 int head m...

藍魔法師 牛客

將一顆 n 1 leq n leq 2000 個結點的樹,分成 t 1 leq t leq n 個連通塊,且每個連通塊的大小都小於或者等於 k 1 leq k leq 2000 求劃分方案數?dp i j 以 i 為根的子樹向父親結點 u 提供 j 個點的貢獻 dp fa i cnt 1 cnt 2...