生活随笔
收集整理的這篇文章主要介紹了
LeetCode LCP 34. 二叉树染色(树上DP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
1. 題目
小扣有一個根結點為 root 的二叉樹模型,初始所有結點均為白色,可以用藍色染料給模型結點染色,模型的每個結點有一個 val 價值。
小扣出于美觀考慮,希望最后二叉樹上每個藍色相連部分的結點個數不能超過 k 個,求所有染成藍色的結點價值總和最大是多少?
示例
1:
輸入:root
= [5,2,3,4], k
= 2
輸出:
12
解釋:結點
5、
3、
4 染成藍色,獲得最大的價值
5+3+4=12
示例
2:
輸入:root
= [4,1,3,9,null
,null
,2], k
= 2
輸出:
16
解釋:結點
4、
3、
9 染成藍色,獲得最大的價值
4+3+9=16
提示:
1 <= k
<= 10
1 <= val
<= 10000
1 <= 結點數量
<= 10000
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/er-cha-shu-ran-se-UGC
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
- 自底向上 DP
- unordered_map<TreeNode*, unordered_map<int, int>> m; 定義:每個節點TreeNode*,該節點相連的藍色點數量,最大的和
class Solution {unordered_map
<TreeNode
*, unordered_map
<int, int>> m
;int n
;
public:int maxValue(TreeNode
* root
, int k
) {n
= k
;dfs(root
);int ans
= 0;for(auto it
= m
[root
].begin(); it
!= m
[root
].end(); ++it
){int v1
= it
->second
;ans
= max(ans
, v1
);}return ans
;}void dfs(TreeNode
* root
){if(!root
) return;dfs(root
->left
);dfs(root
->right
);if(m
.count(root
->left
) && m
.count(root
->right
)){for(auto it
= m
[root
->left
].begin(); it
!= m
[root
->left
].end(); ++it
){int n1
= it
->first
, v1
= it
->second
;for(auto it1
= m
[root
->right
].begin(); it1
!= m
[root
->right
].end(); ++it1
){int n2
= it1
->first
, v2
= it1
->second
;m
[root
][0] = max(m
[root
][0], v1
+v2
);if(n1
+n2
< n
){ m
[root
][n1
+n2
+1] = max(m
[root
][n1
+n2
+1], v1
+v2
+root
->val
);}}}}else if(m
.count(root
->left
)){for(auto it
= m
[root
->left
].begin(); it
!= m
[root
->left
].end(); ++it
){int n1
= it
->first
, v1
= it
->second
;m
[root
][0] = max(m
[root
][0], v1
);if(n1
< n
){ m
[root
][n1
+1] = max(m
[root
][n1
+1], v1
+root
->val
);}}}else if(m
.count(root
->right
)){for(auto it
= m
[root
->right
].begin(); it
!= m
[root
->right
].end(); ++it
){int n1
= it
->first
, v1
= it
->second
;m
[root
][0] = max(m
[root
][0], v1
);if(n1
< n
){ m
[root
][n1
+1] = max(m
[root
][n1
+1], v1
+root
->val
);}}}else{ m
[root
][0] = max(m
[root
][0], 0);m
[root
][1] = max(m
[root
][1], root
->val
);}}
};
880 ms 249.1 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode LCP 34. 二叉树染色(树上DP)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。