DP on Trees - Introduction
Authors: Michael Cao, Benjamin Qi
Using subtrees as subproblems.
Focus Problem – read through this problem before continuing!
Tutorial
Resources | |||
---|---|---|---|
CF | |||
Philippines | bad code format |
Pro Tip
Don't just dive into trying to figure out a DP state and transitions -- make some observations if you don't see any obvious DP solution! Also, sometimes a greedy strategy suffices in place of DP.
Solution - Tree Matching
Solution 1
In this problem, we're asked to find the maximum matching of a tree, or the largest set of edges such that no two edges share an endpoint. Let's use DP on trees to do this.
Root the tree at node , allowing us to define the subtree of each node.
Let represent the maximum matching of the subtree of such that we don't take any edges leading to some child of . Similarly, let represent the maximum matching of the subtree of such that we take one edge leading into a child of . Note that we can't take more than one edge leading to a child, because then two edges would share an endpoint.
Taking No Edges
Since we will take no edges to a child of , the children vertices of can all take an edge to some child, or not. Additionally, observe that the children of taking an edge to a child will not prevent other children of from doing the same. In other words, all of the children are independent. So, the transitions are:
Taking One Edge
The case where we take one child edge of is a bit trickier. Let's assume the edge we take is , where . Then, to calculate for the fixed :
In other words, we take the edge , but we can't take any children of in the matching, so we add . Then, to deal with the other children, we add:
Fortunately, since we've calculated already, this expression simplifies to:
Overall, to calculate the transitions for over all possible children :
Warning!
Loop through the children of twice to calculate and separately! You need to know to calculate .
Code
Solution 2 - Greedy
Just keep matching a leaf with the only vertex adjacent to it while possible.
Code
Problems
Easier
Status | Source | Problem Name | Difficulty | Tags | Solution |
---|---|---|---|---|---|
AC | Easy | Show TagsTree, DP | |||
Gold | Easy | Show TagsTree, DP | External Sol | ||
CF | Normal | Show TagsTree, Greedy | Check CF | ||
POI | Normal | ||||
Gold | Hard | Show TagsGreedy | External Sol | ||
POI | Hard | Show TagsFunc Graph | |||
POI | Hard | Show TagsFunc Graph |
Warning!
Memory limit for "Spies" is very tight.
Harder
These problems are not Gold level. You may wish to return to these once you're in Platinum.
Status | Source | Problem Name | Difficulty | Tags | Solution |
---|---|---|---|---|---|
COI | Very Hard | Show TagsDP, Tree | |||
Plat | Very Hard | Show TagsDP, Tree, Binary Search | External Sol | ||
CF | Very Hard | Show TagsDP, Tree | Check CF | ||
IOI | Insane | Show TagsDP, Tree | External Sol | ||
CSES | Insane | Show TagsTree, Greedy | Show Sketch | ||
Baltic OI | Insane | Show TagsTree, DP |
Module Progress:
Give Us Feedback on DP on Trees - Introduction!
Join the Discussion!
Feel free to voice your thoughts in the comments section.