题意
题解
假设节点满足其子树都被覆盖,则节点存在是否放置摄像头 2 2 2 种可能,以及是否被覆盖 2 2 2 种可能;状态合并后共有 3 3 3 中可能状态:节点无摄像头且未被覆盖(1),节点无摄像头且被覆盖(2),节点有摄像头(3)。
d
p
[
p
]
[
i
]
dp[p][i]
dp[p][i] 代表以
p
p
p 为父节点的子树在状态
i
i
i 所需安装的最少摄像头数。设左儿子/右儿子节点为
c
h
ch
ch,另一个儿子节点为
c
h
′
ch'
ch′,则有
{
d
p
[
p
]
[
1
]
=
d
p
[
c
h
]
[
2
]
+
d
p
[
c
h
′
]
[
2
]
d
p
[
p
]
[
2
]
=
m
i
n
{
d
p
[
c
h
]
[
3
]
+
m
i
n
(
d
p
[
c
h
′
]
[
2
]
,
d
p
[
c
h
′
]
[
3
]
)
}
d
p
[
p
]
[
3
]
=
1
+
m
i
n
1
≤
i
≤
3
{
d
p
[
c
h
]
[
i
]
,
d
p
[
c
h
′
]
[
i
]
}
\begin{cases} dp[p][1]=dp[ch][2]+dp[ch'][2]\\ dp[p][2]=min\{dp[ch][3]+min(dp[ch'][2], dp[ch'][3])\}\\ dp[p][3]=1+min_{1\leq i\leq 3}\{dp[ch][i], dp[ch'][i]\}\\ \end{cases}
⎩⎪⎨⎪⎧dp[p][1]=dp[ch][2]+dp[ch′][2]dp[p][2]=min{dp[ch][3]+min(dp[ch′][2],dp[ch′][3])}dp[p][3]=1+min1≤i≤3{dp[ch][i],dp[ch′][i]}
struct node
{
int x1, x2, x3;
};
class Solution
{
public:
node dfs(TreeNode *root)
{
if (root == NULL) return node{0, 0, INT_MAX / 2};
node a = dfs(root->left), b = dfs(root->right);
int x1 = a.x2 + b.x2;
int x2 = min(a.x3 + min(b.x2, b.x3), b.x3 + min(a.x2, a.x3));
int x3 = 1 + min(min(a.x1, a.x2), a.x3) + min(min(b.x1, b.x2), b.x3);
return node{x1, x2, x3};
}
int minCameraCover(TreeNode *root)
{
node p = dfs(root);
return min(p.x2, p.x3);
}
};