[ACM学习]自上而下树形dp

news/2024/7/23 11:39:46 标签: 学习

问题引入

设置dp状态,相比于更容易出错的贪心更...不易出错。

状态设计

如果选择父结点,就会使孩子结点不能被选择,我们会多开一维的dp,用来标记该点是否被标记过。

以1点举例,f[1][0]为不选它的状态,那么它的子结点2 3 是可选可不选的,所以是 max(f[2][0],f[2][1])+max(f[3][0]+f[3][1]) ,在子结点的两个状态里挑最大值,并且子结点间没有限制,所以直接相加。

f[1][1]=f[2][0]+f[3][0]

所以这题的总体思路是:从叶子结点开始,dp[v][0]=0 dp[v][1]=a_v,并且到达根。

最后结果在 dp[root][0] dp[root][0]里挑一个max

void dfs(int u, int fa)
{
    for (int i = head[u]; i; i = edge[i].nex)
    {
        int v = edge[i].to;
        if (v != fa)
            continue;
        dfs(v, u);
        f[u][0] += max(f[v][0], f[v][1]);
        f[u][1] += f[v][0];
    }
    return ;
}

在这里解释一下自上而上:父结点的状态转移方程是会受到孩子状态值的影响。算法进行的方向还是从叶子计算到根。

问题二

状态设计

二维可以解决,将是否选择这个点并入体积里(选了这个点即为多这个点的体积)

状态转移是什么样的?可以把一个子树的几个孩子看成是几个物品,用类似于背包问题进行状态转移。

当前结点u在体积v1下,由体积v1-v2下加上某一孩子的v2体积下价值与它原来的值进行大小对比。所以我们会对v1 v2进行枚举。

虽然我们类比了01背包,但是和01背包问题相比,某一个子树的体积不是某个定值,而是会从0到最大限度进行枚举。

void dfs(int u, int fa)
{
    memset(f[u], -0x3f, sizeof f[u]);
    if (v[u] <= V)
        f[u][v[u]] = w[u];  //把当前结点放进去,以u为根的子树里,还只放入了结点u
    for (int i = head[u]; i; i = edge[i].nex)   //枚举每一个子树
    {
        int v = edge[i].to;
        if (v == fa)
            continue;
        dfs(v, u);  
   //从叶子开始,
    //,每个孩子结点看成不同的物品,进行01背包
        vector<int> nf(f[u], f[u] + V + 1);  //当前子树的背包过程,用来转移
        for (int v1 = 0; v1 <= V; v1 ++)   //含义:在放入这个子树前,已使用的体积
        {
            for (int v2 = 0; v1 + v2 <= V; v2 ++ )  //放入v2后不能超过V
            {
                nf[v1 + v2] = max(nf[v1 + v2], f[u][v1] + f[v][v2]);
            }
        }
        for (int v = 0; v <= V; v ++ )
            f[u][v] = nf[v];
    }
    return ;
}

问题二进阶

siz[u] 是指,把包含u在内,u为根的子树,把所有权值都加上,得到的和。

虽然还是两层for,但是如果在每个结点都体积为1的情况下,相当于是把以u为子树的每个结点两两进行比较。


http://www.niftyadmin.cn/n/5340718.html

相关文章

部署开源的团队协作工具

简介 Zulip 是一个开源的团队协作工具&#xff0c;拥有独特的基于主题的线程功能&#xff0c;结合了电子邮件和聊天的优点&#xff0c;使远程工作更加高效和愉快。它是唯一设计用于实时和异步对话的现代团队聊天应用程序。其核心优势包括&#xff1a; 适用于大型企业、领先的开…

解决vue 2.6通过花生壳ddsn(内网穿透)实时开发报错Invalid Host header和websocket

请先核对自己的vue版本&#xff0c;我的是2.6.14&#xff0c;其他版本未测试 起因 这两天在维护一个基于高德显示多个目标&#xff08;门店&#xff09;位置的项目&#xff0c;由于高德要求定位必须使用https服务&#xff0c;遂在本地无法获取到定位坐标信息&#xff0c;于是…

仓储管理系统——软件工程报告(总体设计)③

总体设计 一、需求规定 软件工程仓库存储管理系统的需求规定是确保系统能够满足用户期望、提高工作效率、确保数据安全性和系统可维护性的基石。其涵盖了功能性、性能、数据管理、用户界面和系统可维护性等多个方面。通过严格的验收标准&#xff0c;可以确保系统在实际应用中…

Kong关键概念 - 服务(Services)

服务&#xff08;Services&#xff09; 在Kong Gateway中&#xff0c;服务是代表外部上游&#xff08;upstream&#xff09;API或微服务的实体。例如&#xff0c;数据转换微服务、计费API等。 服务的主要属性是其URL。您可以使用一个字符串来指定URL&#xff0c;或者通过分别…

说一下事件代理

事件代理&#xff08;Event Delegation&#xff09;是一种在开发中优化事件处理的技术&#xff0c;它利用事件冒泡的原理&#xff0c;将事件处理程序绑定在父元素上&#xff0c;通过判断事件的目标来执行相应的操作。这种方式可以减少事件处理程序的数量&#xff0c;提高性能&a…

opencv#27模板匹配

图像模板匹配原理 例如给定一张图片&#xff0c;如上图大矩阵所示&#xff0c;然后给定一张模板图像&#xff0c;如上图小矩阵。 我们在大图像中去搜索与小图像中相同的部分或者是最为相似的内容。比如我们在图像中以灰色区域给出一个与模板图像尺寸大小一致的区域&#xff0c;…

新书速览|MediaPipe机器学习跨平台框架实战

MediaPipe助你高效构建移动端短视频应用。MediaPipe、机器学习、短视频应用、视频特效、游戏控制 本书内容 《MediaPipe机器学习跨平台框架实战》以实际项目为线索&#xff0c;带领读者探索MediaPipe在不同场景中的应用&#xff0c;使读者既能了解理论知识&#xff0c;又能通过…

图论基本知识--->最短路练习--->最小生成树

图论基本概念&#xff1a; 自环 重边 孤点 简单图 有向图&#xff0c;无向图 简单图&#xff1a; 无向图的度数 有向图的度数&#xff1a;出度&#xff0c;入度 每个图的最大度&#xff0c;最小度 完全图&#xff08;无向图&#xff09;&#xff1a; 完全图&#xff…