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

问题引入

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

状态设计

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

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

f11=f20+f30

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

最后结果在 dproot0 dproot0里挑一个max

cpp 复制代码
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到最大限度进行枚举。

cpp 复制代码
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 ;
}

问题二进阶

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

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

相关推荐
a1117766 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
我的xiaodoujiao6 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
你想知道什么?8 小时前
线性回归-学习笔记
笔记·学习·线性回归
鱼毓屿御8 小时前
从「只会聊」到「边想边做」的跃迁
前端·学习·react.js
AOwhisky9 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
minglie111 小时前
zynq中linux系统的自动登录和免密登录
学习
茯苓gao11 小时前
嵌入式开发笔记:Qt信号槽机制深度解析——从原理到实战的全方位指南
开发语言·笔记·嵌入式硬件·qt·学习
我想我不够好。12 小时前
监控学习 7.23 1.5hour
学习
泰勒朗斯14 小时前
Helicopter FBI-405尾电机版本设置
学习
minglie116 小时前
香橙派zero3配个iic屏显示ip
linux·学习