codeforces 416B. Appleman and Tree 樹形dp

來源:互聯網
上載者:User

標籤:

題目連結

 

Fill a DP table such as the following bottom-up:

  • DP[v][0] = the number of ways that the subtree rooted at vertex v has no black vertex.
  • DP[v][1] = the number of ways that the subtree rooted at vertex v has one black vertex.

The recursion pseudo code is folloing:

DFS(v): DP[v][0] = 1 DP[v][1] = 0 foreach u : the children of vertex v  DFS(u)  DP[v][1] *= DP[u][0]  DP[v][1] += DP[v][0]*DP[u][1]  DP[v][0] *= DP[u][0] if x[v] == 1:  DP[v][1] = DP[v][0] else:  DP[v][0] += DP[v][1]

The answer is DP[root][1]

 

#include <iostream>#include <vector>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <map>#include <set>#include <string>#include <queue>#include <stack>#include <bitset>using namespace std;#define pb(x) push_back(x)#define ll long long#define mk(x, y) make_pair(x, y)#define lson l, m, rt<<1#define mem(a) memset(a, 0, sizeof(a))#define rson m+1, r, rt<<1|1#define mem1(a) memset(a, -1, sizeof(a))#define mem2(a) memset(a, 0x3f, sizeof(a))#define rep(i, n, a) for(int i = a; i<n; i++)#define fi first#define se secondtypedef pair<int, int> pll;const double PI = acos(-1.0);const double eps = 1e-8;const int mod = 1e9+7;const int inf = 1061109567;const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };const int maxn = 1e5+2;ll dp[maxn][2];int head[maxn], num, k, a[maxn];struct node{    int to, nextt;}e[maxn*2];void add(int u, int v) {    e[num].to = v, e[num].nextt = head[u], head[u] = num++;}void init() {    num = 0;    mem1(head);}void dfs(int u, int fa) {    dp[u][1] = 0;    dp[u][0] = 1;    for(int i = head[u]; ~i; i = e[i].nextt) {        int v = e[i].to;        if(v == fa)            continue;        dfs(v, u);        dp[u][1] = dp[u][1]*dp[v][0]%mod;        dp[u][1] = (dp[u][1]+dp[u][0]*dp[v][1]%mod)%mod;        dp[u][0] = dp[u][0]*dp[v][0]%mod;    }    if(a[u]) {        dp[u][1] = dp[u][0];    } else {        dp[u][0] = (dp[u][0]+dp[u][1])%mod;    }}int main(){    int n, x, y;    cin>>n;    init();    for(int i = 1; i<n; i++) {        scanf("%d", &x);        add(x, i);        add(i, x);    }    for(int i = 0; i<n; i++)        scanf("%d", &a[i]);    dfs(0, -1);    cout<<dp[0][1]<<endl;    return 0;}

 

codeforces 416B. Appleman and Tree 樹形dp

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.