此题和打家劫舍问题有一点相似,但还是差的挺多的。主要是dp状态的定义,是以当前节点结尾的相连i个元素的最大可能值。更新时,如果不涂节点,返回两边最大值的和,如果涂的话,用两边的可能性组合进行更新,比打家劫舍还是要难的。
/**
* 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 {
int K;
public:
vector<int> dfs(TreeNode* node)
{
if(node == nullptr)return vector<int>(K);
auto dp1 = dfs(node->left), dp2 = dfs(node->right);
vector<int> dp(K);
dp[0] = *max_element(dp1.begin(), dp1.end()) + *max_element(dp2.begin(), dp2.end());
// 染色的情况
for(int i=1;i<K;i++)
{
for(int j=0;j<i;j++)
{
dp[i] = max(dp[i], dp1[j]+dp2[i-1-j]+node->val);
}
}
return dp;
}
int maxValue(TreeNode* root, int k) {
K = k+1;
auto dp = dfs(root);
return *max_element(dp.begin(), dp.end());
}
};