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...