Codeforces Round #263 (Div. 2) D. Appleman and Tree 树形dp
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS之代理模式
- 下一篇: Shell awk文本处理,shell