第一道樹狀dp。
第一種方法,也是最容易想到的基本的dp。乙個節點的最大錢數,就是opt(left)+opt(right)和val+ll+lr+rl+rr的最大值。這樣做的話,會增加很多搜尋的時間,時間1000ms左右
/**
* definition for a binary tree node.
* struct treenode
* };
*/class solution
int opt(treenode* node)
if(rt)
int l=opt(lt);
int r=opt(rt);
return (node->val+ll+lr+rr+rl)>(l+r)?(node->val+ll+lr+rr+rl):l+r;
}};
而另一種方法,核心思想:每個節點有2種狀態,選這個節點或者不選這個節點。然後用乙個vector儲存起來(0為選,1為不選)。那麼,這個節點的最大值為left[1]+right[1]+val和max(left)+max(right)中的最大值。這樣只用dfs兩邊,而不是剛剛的6個點。
/**
* definition for a binary tree node.
* struct treenode
* };
*/class solution
int rob(treenode* root)
};
LeetCode 第337題打家劫舍 III
題目描述 在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為 根 除了 根 之外,每棟房子有且只有乙個 父 房子與之相連。一番偵察之後,聰明的小偷意識到 這個地方的所有房屋的排列類似於一棵二叉樹 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自...
LeetCode337 樹 打家劫舍 III
遞迴求解 本質上就是間隔遍歷 把問題直接簡化成兩個部分 偷父節點。那就是隔行遍歷左右節點,因為不能偷連續的節點。但是注意,隔行遍歷一定要判斷有無空指標!不偷父節點。可以畫幾個示意圖看看,不偷父節點的話就是父節點的左子樹 右子樹的值,依次加下去 最後返回乙個最大的金額 class solution i...
騰訊面試 打家劫舍 III
題目 在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為 根 除了 根 之外,每棟房子有且只有乙個 父 房子與之相連。一番偵察之後,聰明的小偷意識到 這個地方的所有房屋的排列類似於一棵二叉樹 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報...