Leetcode题目:House Robber III

题目:

The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all houses in this place forms a binary tree". It will automatically contact the police if two 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.

 

Example 2:

     3
    / \
   4   5
  / \   \ 
 1   3   1

Maximum amount of money the thief can rob = 4 + 5 = 9.

题目解答:

这个题目是在之前House Robber 和House Robber II之上的变体。它要求的是在树上的动归。需要用到深度优先搜索和动归的思想。一样的,相邻节点不能偷。

另外借助一个辅助结构,来帮助我们存动归中需要比较的两个值。

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
 
struct robMoney  //辅助数据结构,用来记录动态规划过程中的两个整型值
{
   int noRob;   //不偷当前这一家,可以得到的金钱数目
   int curRob;  //在当前这个位置,可以获得到的金钱数目最大值
   robMoney():noRob(0),curRob(0){}
};


class Solution {
public:
    int rob(TreeNode* root) {
        if(root == NULL)
            return 0;
        robMoney res = dfs(root);
        return res.curRob;//在当前位置所能获得的金钱数目最大值
    }
    
    robMoney dfs(TreeNode *root)  //深度优先搜索
    {
        robMoney money;
        if(root == NULL)
        {
            return money;
        }
        robMoney left = dfs(root -> left);
        robMoney right = dfs(root -> right);
        money.noRob = left.curRob + right.curRob; //当前这家选择不偷
        money.curRob = max(money.noRob, left.noRob + right.noRob + root -> val); //取二者的最大值
        return money;
    }
    
    
    int max(int a, int b)
    {
        return a > b ? a : b;
    }
};

  

posted @ 2016-06-01 11:22  CodingGirl121  阅读(126)  评论(0编辑  收藏  举报