The thief has found himself a new place for his thievery again. There is a entrance to this area, called the "root." Besides the root, each house have one and only one parent house. After a tour, the Smart thief realized the ' all houses in this ' place forms a binary tree. It would automatically contact the police if and directly-linked houses were broken into on the same night.
Determine the maximum amount of money the thief can rob tonight without alerting the police.
Example 1:
3 / 2 3 \ \ 3 1
Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.
Main topic
Given a one or two-fork tree, the tree node has the right value, selecting some nodes that are not directly adjacent from the tree, making the node and the maximum
Thinking process
1. Simple rough, search is done, a node is only two cases, select or do not choose, in addition to the current node selection, the child node cannot be selected, if the current node is not selected, it can be divided into four cases
* Left selection, right not selected
* Right Select, left not selected
* Left and Right choice
* No choice left or right
2. write the code, OK but timeout (of course-_-later read the other answers, only to find too young)
3. because of the repeated calculation, and then to the dynamic planning considerations, and then came up with a state
D[0][1], where 0 indicates that the store iterates to the current node, taking the maximum value that the current node can reach, while 1 indicates that the maximum value that the current node can reach is not taken
Also because it is a tree node, so direct hash table storage d[treenode*][]
4. traversal sequence, habitual post-order traversal
5. Calculation rules
Obviously, the current node is taken, and the child node cannot take
D[treenode*][0] = Treenodeval + d[leftchild][1] + d[rightchild][1]
Four kinds of situations
D[TREENODE*][1] = max (d[leftchild][0] + d[rightchild][0], d[leftchild][1] + d[rightchild][0], d[leftchild][0] + d[ RIGHTCHILD][1], d[leftchild][1] + d[rightchild][1])
6. Finally, with the code; After reading the discussion, I thought it was too young, ╮(╯▽╰)╭.
1 classSolution {2 Public:3 intRob (treenode*root) {4 if(Root = =NULL) {5 return 0;6 }7 8 Postorder (root);9 returnMax (d[root][0], d[root][1]);Ten } One A voidPostorder (treenode*ITR) { - if(ITR = =NULL) { - return; the } - -Postorder (itr->Left ); -Postorder (itr->Right ); + -Auto Ditr = D.insert (pair<treenode*, vector<int>> (ITR, vector<int> (2,0))); +Auto Leftitr = ditr.first->first->Left ; AAuto Rightitr = ditr.first->first->Right ; at - intRL = ditr.first->first->left! = NULL? d[ditr.first->first->left][0] :0; - intRR = ditr.first->first->right! = NULL? d[ditr.first->first->right][0] :0; - intUL = ditr.first->first->left! = NULL? d[ditr.first->first->left][1] :0; - intUR = ditr.first->first->right! = NULL? d[ditr.first->first->right][1] :0; - inditr.first->second[0] = Ditr.first->first->val + UL +UR; -ditr.first->second[1] = MAX (max (RL + UR, UL + RR), RL + RR), UL +UR); to } + - Private: theunordered_map<treenode*, vector<int>>D; *};
View Code
Draw on DP thought: HOUSEROBBERIII