LeeCode 968 树状 DP

题意

传送门 LeeCode 968. 监控二叉树

题解

假设节点满足其子树都被覆盖,则节点存在是否放置摄像头 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+min1i3{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);
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值