日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp

發布時間:2024/7/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈接:

http://codeforces.com/contest/462/problem/D

題意:

給定n個點的樹,

0為根,下面n-1行表示每個點的父節點

最后一行n個數 表示每個點的顏色,0為白色,1為黑色。

把樹分成若干個聯通塊使得每個聯通塊有且僅有一個黑點,問有多少種分法(結果mod1e9+7)

題解:

樹形dp,每個點有2個狀態,已經歸屬于某個黑點和未歸屬于某個黑點。

代碼:

31 int n; 32 int x[MAXN]; 33 VI G[MAXN]; 34 ll dp[MAXN][2]; 35 36 void dfs(int u) { 37 if (x[u]) dp[u][1] = 1; 38 else dp[u][0] = 1; 39 rep(i, 0, G[u].size()) { 40 int v = G[u][i]; 41 dfs(v); 42 ll old[2] = { dp[u][0], dp[u][1] }; 43 dp[u][0] = (old[0] * dp[v][1] + old[0] * dp[v][0]) % MOD; 44 dp[u][1] = (old[1] * dp[v][1] + old[1] * dp[v][0] + old[0] * dp[v][1]) % MOD; 45 } 46 } 47 48 int main() { 49 ios::sync_with_stdio(false), cin.tie(0); 50 cin >> n; 51 rep(i, 1, n) { 52 int p; 53 cin >> p; 54 G[p].pb(i); 55 } 56 rep(i, 0, n) cin >> x[i]; 57 dfs(0); 58 cout << dp[0][1] << endl; 59 return 0; 60 }

?

轉載于:https://www.cnblogs.com/baocong/p/7288245.html

總結

以上是生活随笔為你收集整理的Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。