当前位置: 首页 > news >正文

leetcode 337. House Robber III

题意

题目链接: https://leetcode.com/problems/house-robber-iii/
就是一颗树,然后头结点选了的话,只能选孙子结点
然后求这个树的可以选的最大的和

解法一

暴力+记忆化, 就是dfs(root, can)表示 当前root结点 可不可以被选
显然当前节点 可以选的话 结果就是 max(root->val + dfs(root->l, notcan) + dfs(root->r, notcan), dfs(root->l, can) + dfs(root->r, can))
如果不可以选的话 结果就是 dfs(root->l, can) + dfs(root->r, can)

typedef pair<TreeNode*, bool> ptb;
class Solution {
public:
    map<ptb, int> mp;
    
    int dfs(TreeNode *root, bool can) {
        if(root==NULL) return 0;
        if(mp.count({root, can}))
            return mp[{root, can}];
        if(can) {
            mp[{root,can}] =  max(root->val + dfs(root->left, !can) + dfs(root->right, !can),
                       dfs(root->left, true)+dfs(root->right, true));
            return mp[{root, can}];
        } else {
            mp[{root,can}] = dfs(root->left, true) + dfs(root->right, true);
            return mp[{root, can}];
            // return dfs(root->left, true) + dfs(root->right, true);
        }
    }
    
    int rob(TreeNode* root) {
        if(root == NULL) return 0;
        return dfs(root, true);
    }
};

解法二

我们使用vector来存 两个值
v[0] 代表当前节点可以选 v[1] 代表节点不可以选的最大值

那么很显然同上面,直接v[root][0] = max(root->val+v[root->l][1]+v[root->r][1], v[root->l][0]+v[root->r][0]);
v[root][1] = v[root->l][0]+v[root->r][0]
递归求解即可

class Solution {
public:
    
    // v[0] means rob the root, v[1] means not rob the root
    vector<int> dfs(TreeNode *root) {
        if(root == NULL)
            return {0, 0};
        vector<int> v1 = dfs(root->left);
        vector<int> v2 = dfs(root->right);
        int res1 = max(root->val + v1[1] + v2[1], v1[0]+v2[0]);
        int res2 = v1[0]+v2[0];
        return {res1, res2};
    }
    
    int rob(TreeNode* root) {
        vector<int> s = dfs(root);
        return max(s[0], s[1]);
    }
};

转载于:https://www.cnblogs.com/Draymonder/p/11297866.html

相关文章:

  • Durandal入门
  • js中使用EL表达式总结
  • leetcode 309. Best Time to Buy and Sell Stock with Cooldown
  • 环境变量
  • 手机端和网页端使用同一后台时进行会话控制
  • SpringBoot起步
  • 获取当前python 解释器的路径=.=
  • $.proxy和$.extend
  • Java Web 开发必须掌握的三个技术:Token、Cookie、Session
  • springBoot测试
  • SpringBoot传参方式
  • Springboot项目自动加载设置
  • SpringBoot项目打包
  • Win10修改字体
  • c언어 database
  • ----------
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Babel配置的不完全指南
  • Docker下部署自己的LNMP工作环境
  • golang中接口赋值与方法集
  • Hibernate【inverse和cascade属性】知识要点
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Quartz初级教程
  • springMvc学习笔记(2)
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Vue.js 移动端适配之 vw 解决方案
  • 官方解决所有 npm 全局安装权限问题
  • 我有几个粽子,和一个故事
  • 详解移动APP与web APP的区别
  • 新版博客前端前瞻
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 最近的计划
  • 《码出高效》学习笔记与书中错误记录
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • #pragma pack(1)
  • (1)(1.13) SiK无线电高级配置(六)
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (LeetCode 49)Anagrams
  • (python)数据结构---字典
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (solr系列:一)使用tomcat部署solr服务
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (顺序)容器的好伴侣 --- 容器适配器
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)Windows2003安全设置/维护
  • .NET Core 成都线下面基会拉开序幕
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调