博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LeetCode 337 & 329. memorization DFS】House Robber III
阅读量:5257 次
发布时间:2019-06-14

本文共 3048 字,大约阅读时间需要 10 分钟。

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public://递归程序就是结构演绎,有点像dp,只要定义好每一次递归过程完成的是同一个目标,就能保证所有递归结束之后完成的效果是最终的目标    int rob_naive(TreeNode* root) {
// 返回当前节点开始的能够rob的最大值。 if(root == NULL) return 0;//当前节点为空 0 int val = 0; if(root -> left)//左孩子不空 val += rob(root -> left -> left) + rob(root -> left -> right); //rob当前root 和 root 的孩子的孩子的能rob到的最大值。这里并不是rob孩子的孩子,而是孩子的孩子能rob的最大值就像这个递归结构每一次完成的目标一样。 if(root -> right) val += rob(root -> right -> left) + rob(root -> right -> right); return max(val + root -> val, rob(root -> left) + rob(root -> right)); //返回 rob(root, root's children 's children or root's children) } //看上面的方案(1330 ms):每一次我们都考虑了 root.left.left & root.left.right & root.right.left & root.right.right // root.left & root.right 这里在递归计算的时候还是会算到上面计算过的值。 //所以给出一个考虑一步之后的优化记忆搜索。 int rob(TreeNode* root){ unordered_map
mp; return robMemeryDFS(root, mp); } //考虑一步的记忆化搜索(16 ms): 快了接近100倍 int robMemeryDFS(TreeNode* root, unordered_map
&mp){ if(root == NULL) return 0; if(mp[root]) return mp[root]; int val = 0; if(root -> left)//左孩子不空 val += robMemeryDFS(root -> left -> left, mp) + robMemeryDFS(root -> left -> right, mp); if(root -> right) val += robMemeryDFS(root -> right -> left, mp) + robMemeryDFS(root -> right -> right, mp); mp[root] = max(val + root -> val, robMemeryDFS(root -> left, mp) + robMemeryDFS(root -> right, mp)); return mp[root]; }};

 附加一道 同样使用记忆化搜索的题目 329. Longest Increasing Path in a Matrix

class Solution {public:    int dir[4][2] = {
{
1, 0}, {-1, 0}, {
0, 1}, {
0, -1}}, n, m; int dfs(int x, int y, vector
>& matrix, vector
>&steps){ if(steps[x][y]) return steps[x][y]; int maxSteps = 0; // record the longest path steps from (x, y) for(int i = 0; i < 4; i ++){ int nx = dir[i][0] + x, ny = dir[i][1] + y, tmp = 0; if(nx >= 0 && ny >= 0 && nx < n && ny < m && matrix[nx][ny] > matrix[x][y]){ maxSteps = max(maxSteps, dfs(nx, ny, matrix, steps)); } } steps[x][y] = maxSteps + 1; // + 1 for cur(x, y) return steps[x][y]; } int longestIncreasingPath(vector
>& matrix) { if(matrix.size() == 0) return 0; n = matrix.size(), m = matrix[0].size(); int ans = 0; vector
>steps(n, vector
(m, 0)); for(int i = 0; i < n; i ++) for(int j = 0; j < m; j ++) ans = max(ans, dfs(i, j, matrix, steps)); return ans; }};

 

转载于:https://www.cnblogs.com/luntai/p/6936588.html

你可能感兴趣的文章
AJAX(XMLHttpRequest)进行跨域请求方法详解
查看>>
1.1C++入门 未完待续。。。
查看>>
ADO.NET基础必备之SqlDataReader 类
查看>>
python:模块定义、导入、优化
查看>>
python:协程
查看>>
Container With Most Water
查看>>
Map接口
查看>>
Spring的学习
查看>>
HttpWebRequest.CookieContainer与HttpWebResponse.Cookies的区别和联系
查看>>
python中json与pickle的简要说明
查看>>
POJ-3468A Simple Problem with Integers,线段数区间更新查询,代码打了无数次还是会出错~~...
查看>>
启动线程的方法总结
查看>>
学习shell script
查看>>
python 反射机制
查看>>
android 删除应用
查看>>
多线程小模块
查看>>
17.Generator函数的异步应用
查看>>
LODOP打印控件如何提示用户升级下载安装新版本
查看>>
C 运算优先级口诀
查看>>
【不积跬步,无以致千里】DELETE SINGLE IPTABLES RULES
查看>>