337. 打家劫舍 III

树形DP。

  1. DP数组的含义,这个已经不再是数组了,不过含义和之前相同
  2. 遍历顺序,下面单独讲
  3. 初始值,也不需要了
  4. 打印DP数组,打印递归不是个明智的选择

得用递归,递归函数要求获取算当前节点和不算当前节点时最大的dp结果。
直接看代码吧,如果不选当前节点,不一定leftresult就一定得选择has,右节点同理;如果选了当前节点,左右就肯定得选nothas了

class result {
 public:
  int has_;
  int notHas_;
  result() : has_(0), notHas_(0) {}
  result(int has, int notHas) : has_(has), notHas_(notHas) {}
  int getMax()
  {
      return max(has_, notHas_);
  }
};

result treeRob(TreeNode *cur) {
  if (nullptr == cur) {
    return {0, 0};
  }

  auto leftResult = treeRob(cur->left);
  auto rightResult = treeRob(cur->right);

  result curResult;
  curResult.notHas_ = leftResult.getMax() + rightResult.getMax();
  curResult.has_ = cur->val + leftResult.notHas_ + rightResult.notHas_;
  return curResult;
}

int rob(TreeNode *root) {
  if (nullptr == root) {
    return 0;
  }
  auto ret = treeRob(root);
  return ret.getMax();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tux~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值