c++
class Solution {
public:
void getDP(TreeNode* root, int dp[2][2]) {
if (!root) {
dp[0][0] = 0;
dp[0][1] = 10000;
dp[1][0] = 0;
dp[1][1] = 10000;
return ;
}
if (!root->left && !root->right) {
dp[0][0] = 10000;
dp[0][1] = 1;
dp[1][0] = 0;
dp[1][1] = 1;
return ;
}
int l[2][2] = {0}, r[2][2] = {0};
getDP(root->left, l);
getDP(root->right, r);
dp[0][0] = min(min(l[0][1] + r[0][0], l[0][0] + r[0][1]), l[0][1] + r[0][1]);
dp[1][0] = min(min(l[0][0] + r[0][0], l[0][1] + r[0][1]), min(l[0][1] + r[0][0], l[0][0] + r[0][1]));
dp[0][1] = min(min(l[1][0] + r[1][0], l[1][1] + r[1][1]), min(l[1][1] + r[1][0], l[1][0] + r[1][1])) + 1;
dp[1][1] = dp[0][1];
return ;
}
int minCameraCover(TreeNode* root) {
int dp[2][2] = {0};
getDP(root, dp);
return min(dp[0][1], dp[0][0]);
}
};
js
function getDp(root, dp) {
if (!root) {
dp[0][0] = 0;
dp[0][1] = 10000;
dp[1][0] = 0;
dp[1][1] = 10000;
return ;
}
if (!root.left && !root.right) {
dp[0][0] = 10000;
dp[0][1] = 1;
dp[1][0] = 0;
dp[1][1] = 1;
return ;
}
var l = Array(2).fill(0).map(x => Array(2).fill(0)), r = Array(2).fill(0).map(x => Array(2).fill(0));
getDp(root.left, l);
getDp(root.right, r);
dp[0][0] = Math.min(l[0][1] + r[0][1], l[0][1] + r[0][0], l[0][0] + r[0][1]);
dp[0][1] = Math.min(l[1][1] + r[1][1], l[1][1] + r[1][0], l[1][0] + r[1][1], l[1][0] + r[1][0]) + 1;
dp[1][0] = Math.min(l[0][1] + r[0][1], l[0][1] + r[0][0], l[0][0] + r[0][1], l[0][0] + r[0][0]);
dp[1][1] = dp[0][1];
return ;
}
var minCameraCover = function(root) {
var dp = Array(2).fill(0).map(x => Array(2).fill(0));
getDp(root, dp);
return Math.min(dp[0][1], dp[0][0]);
};