当前位置: 首页 > news >正文

ABC 416 F

F

树形 \(dp\)

状态定义

\(dp_{u,j,0/1}\):考虑子树 \(u\) (\(0\) 表示不算入结点 \(u\)\(1\) 表示算入结点 \(u\)), 选取恰好 \(j\) 条互不重叠的路径,权值和的最大值

\(f_{u,j}\):考虑子树 \(u\),选取恰好 \(j\) 条互不重叠的路径,并且其中必须存在一条路径以 \(u\) 为端点,权值和的最大值

状态转移

前置知识:树形 \(dp\) 在还没开始转移时,子树 \(u\) 中只有结点 \(u\) 自己;在转移过程中,经过从子树 \(v\) 的转移后,子树 \(v\) 合并到子树 \(u\) 中。也就是说子树 \(u\) 在转移过程中是动态扩容的

\(init:\) \(dp[u][0][0] = dp[u][0][1] = 0\)\(dp[u][1][1] = f[u][1] = a[u]\);其他状态均初始化为 \(-INF\)

\(trans:\)

  1. 计算 \(dp[u][j][0]\):由于子树 \(u\) 内未计入结点 \(u\),因此子树 \(u\) 和子树 \(v\) 之间不会形成新的路径,二者相互独立,分别计入各自部分的路径即可。

\[dp_{u,j,0} = max(dp_{u,j1,0} + dp_{v,j2,1}),j1+j2=j \]

  1. 计算 \(dp[u][j][1]\):此时子树 \(u\) 内包括点 \(u\),需要考虑子树 \(u\) 与 子树 \(v\) 之间是否会形成新的路径——显然,只有 子树 \(u\) 内以 \(u\) 为端点的路径子树 \(v\) 内以 \(v\) 为端点的路径 可以合并为一条路径,这恰好可以由 \(f\) 转移过来:

\[dp_{u,j,1} = max(f_{u,j1} + f_{v,j2}),j1+j2=j-1 \]

\(\space\space\space\space\space\) 注意上式 \(j1+j2=j-1\),因为路径合并使得总路径少了一条。

\(\space\space\space\space\space\) 当然还需要考虑没有路径合并时的情况,此时两棵子树独立:

\[dp_{u,j,1} = max(dp_{u,j1,1} + dp_{v,j2,1}),j1+j2=j \]

  1. 计算 \(f[u][j]\):仍需要分两种情况:
  • \(u\) 为端点的路径在原来的子树 \(u\) 中:

    \[f_{u,j} = max(f_{u,j1} + dp_{v,j2,1}),j1+j2=j \]

  • \(u\) 为端点的路径在子树 \(v\) 中:此时 \(u\) 作用于子树 \(v\),子树 \(u\) 内应不再包括 \(u\),应从 \(dp_{u,j,0}\) 转移:

    \[f_{u,j} = max(f_{v,j1} + a_{u} + dp_{u,j2,0}),j1+j2=j \]

\(ans: max_{i=0}^{k}(dp[1][i][1])\)

需要特别注意:若发现在转移式右侧有正在被转移的对象,则转移前需要将合并子树前的结果复制下来,并从复制下来的结果转移,否则转移时可能会将覆盖后的结果作为转移来源,进而发生错误。推荐 \(dp\) 数组写成 \(vector\) 的形式,以直接赋值的方式复制合并前的 \(dp\) 数组,代码非常简洁。

上述转移一次 \(dfs\) 即可完成,复杂度 \(O(nk^{2})\)。具体细节见代码

code

http://www.njgz.com.cn/news/186.html

相关文章:

  • 除法取模需使用费马小定理或者欧拉函数
  • LLaMA Factory:一站式大模型微调框架的技术介绍
  • 2025727
  • 读《大道至简》有感
  • Datawhale AI夏令营-DeepSeek数学推理蒸馏:轻量化模型的高效推理优化
  • Windows操作QEMU安装ARM架构的操作系统
  • 34th@202508工作清单@20250726
  • 用 Go 与 Tesseract 构建验证码识别 HTTP 服务
  • CS144 Lab2: TCPReceiver实现全解析
  • windows操作QEMU安装ARM架构操作系统
  • 使用 Go 构建基于 Tesseract 的命令行验证码识别工具
  • SpringCloud微服务架构-Gateway服务网关
  • 暑期生活学习笔记
  • 好的调试
  • 20250726 之所思 - 人生如梦
  • Day15 面向对象编程
  • if语句
  • 使用 Go 调用 Tesseract 实现验证码图片文字提取
  • 最长有效括号子串问题
  • 数组练习试题2
  • 7.26 训练总结
  • AirSim基础使用【Python】
  • 7.25
  • SQLAlchemy
  • GPT-SoVITS初探
  • 6. 容器类型
  • 在Ubuntu系统中搭建Unreal4和AirSim环境
  • 深度解析苹果端侧与云端基础模型技术架构
  • 关于properties文件遇到的坑
  • 当日总结