树形DP | dtyfc



树形DP。

定义dp[x][0]表示切割后,以x为根的子树没有黑点的方案数,dp[x][1]表示切割后以x为根的子树有一个黑点的方案数。然后我们任选一个点作为根开始dfs,然后从下至上更新每个节点的信息。

如果x这个点本身就是黑点,那么dp[x][0]没有意义,只考虑dp[x][1]。设x的一个儿子是u,假设我们切断了(x, u)这条边的话,那么方案数就应该有dp[x][1] * dp[u][1],因为切断之后它的儿子所在的块内必须有黑点;如果不切断的话,那么方案数有dp[x][1] * dp[u][0],因为不切断的话,自己本身是黑点,就不允许儿子所在的子数中有黑点。所以对于每一个u,dp[x][1] *= (dp[u][0] + dp[u][1])。

如果x这个点是一个白点的,同样地,我们考虑它和它的一个儿子u之间的边(u, v)。先考虑dp[x][0]和如更新,如果切断这条边,那么儿子所在的子树必须有黑点,方案数有dp[x][0] * dp[u][1];如果不切割,因为dp[x][0]表示以x为根的的子树中没黑点,所以u为根的子树中一定也不能有黑点,方案数有dp[x][0] * dp[u][0]。所以dp[x][0] *= (dp[u][0] + dp[u][1])。再考虑如何更新dp[x][1],因为x本身是一个白点,所以它的子树中必定有黑点。我们同样考虑(u, x)这条边切不切,会得到dp[x][1] * (dp[u][0] + dp[u][1])的方案,与之前不同的是,如果不切的话,还会有额外的方案数dp[x][0] * dp[u][1],表示以之前的儿子为根的子树里都是白点,以u为根的子树里有黑点的方案。即dp[x][1] = dp[x][0] * dp[u][1] + dp[x][1] * (dp[u][0] + dp[u][1])。

最后的方案数就是dp[root][1],因为他是这棵树的树根,切割之后他一定属于某个包含黑点的块里,所以子树必须有一个黑点。


Read full article from 树形DP | dtyfc


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts