首页 > 其他分享 >树形DP之点覆盖问题

树形DP之点覆盖问题

时间:2022-11-07 19:37:42浏览次数:69  
标签:覆盖 最小 son 边覆盖 树形 DP 之点 儿子 dp

什么是点覆盖问题?

就是在树上选几个点,覆盖(一个点可以覆盖其相连的边或与其距离不超过 \(d\) 的点,根据题意具体分析)一些点或边,求最小代价。

例题

战略游戏

题意

一棵无根树,一个点可以覆盖与其相连的边,求将整棵树的边覆盖,最少需要放置几个点。

思路

可以发现,根是哪个点,对答案没有影响,那我们就假定1为根,来简化问题。
这样每条边肯定就是连着父亲和儿子,要么被父亲覆盖,要么被儿子覆盖,或者被父亲和儿子一起覆盖。
每个节点都有放和不放两种状态。
设\(dp[i][0/1]\)表示该节点不放和放可以将以i为根的子树的边覆盖的最小代价。

  • \(dp[i][0]+=dp[son[i]][1]\)
    该点不放,它和它儿子的边就得由儿子来覆盖,儿子必须放。
  • \(dp[i][1]+=min(dp[son[i]][0],dp[son[i]][1])\)
    该点放,它和它儿子的边已经被该点覆盖,儿子放不放都行,取最小。
  • \(ans=min(dp[i][0],dp[i][1])\)
    答案来自1号节点放或不放(可以将整棵子树覆盖的最小代价),两者取最小。
    时间复杂度:\(O(n)\)

VOCV - Con-Junctions

题意

一棵无根树,一个点可以覆盖与其相连的边,求将整棵树的边覆盖,最少需要放置几个点。并求出最小代价的方案数。

思路

对于第一问,和上一题一样,不再赘述。
来看第二问,求最小代价的方案数。
维护一个 \(g[i][0/1]\), 表示该节点不放和放可以将以 \(i\) 为根的子树的边覆盖的最小代价的方案数。
在 \(dp\) 值转移时进行维护。\(g\) 的初始值都为1。

  • \(dp[i][0]+=dp[son[i]][1]\),该 \(dp\) 值只能由所有儿子都放转移过来。\(g[i][0]*=g[son[i]][1]\)。
  • \(dp[i][1]+=min(dp[son[i]][0],dp[son[i]][1])\),该 \(dp\) 值有两种转移途径,分三种情况。
  1. \(dp[son[i]][0]<dp[son[i]][1]\),\(dp\) 值由 \(dp[son[i]][0]\) 转移过来。
    \(g[i][1]*=g[son[i]][0]\)
  2. \(dp[son[i]][0]>dp[son[i]][1]\),\(dp\) 值由 \(dp[son[i]][1]\) 转移过来。
    \(g[i][1]*=g[son[i]][1]\)
  3. \(dp[son[i]][0]==dp[son[i]][1]\),\(dp\) 值要么由 \(dp[son[i]][0]\) 转移过来,要么由 \(dp[son[i]][1]\) 转移过来,都可以。
    \(g[i][1]*=(g[son[i]][0]+g[son[i]][1])\)
  • 最后输出第一问:\(min(dp[1][0],dp[1][1])\)。
  • 输出第二问:1. \(dp[1][0]<dp[1][1]\)
    输出\(g[1][0]\)。
  1. \(dp[1][0]==dp[1][1]\)
    输出 \((g[1][0]+g[1][1])%mod\) 一定要取模啊。
  2. \(dp[1][0]>dp[1][1]\)
    输出\(g[1][1]\)。
    时间复杂度:\(O(Tn)\)。

标签:覆盖,最小,son,边覆盖,树形,DP,之点,儿子,dp
From: https://www.cnblogs.com/Travller/p/16867129.html

相关文章

  • Xiaoning Sun-2022-OverlookedPosesActuallyMakeSence-Distilling Privileged Knowled
    #OverlookedPosesActuallyMakeSense:DistillingPrivilegedKnowledgeforHumanMotionPrediction#paper1.paper-info1.1.MetadataAuthor::[[XiaoningS......
  • 数位dp二则
    MagicNumbers CodeForces-628D题意:求区间[l,r]间偶数位都是d,奇数位都不是d的个数。l和r位数相等。解:l和r位数相等,很舒服,不用判前导0了。记录一下位数,判断其位置和......
  • 线性DP
    线性DP例题1:TakandCardsAtCoderARC060ATakandCards有\(n\)个整数。第\(i\)个数的值为\(x_i\)。从这些整数中挑选\(1\)个及以上,使选择的整数的平均数等......
  • Debian 11 安装snap(snapd)之后使用apt(apt-get)安装软件报错"E:Sub-process /usr/bin
    1问题描述与分析为了安装notepad++,安装先安装了snap,貌似失败了,又安装了snapd,sudoaptinstallsnapd#sudoaptinstallsnap然后再用aptinstall时就报错:dpkg-dev......
  • dp-leetcode152
    动态规划问题,存在重叠子问题/***<p>给你一个整数数组<code>nums</code> ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘......
  • Java 线程池之ThreadPoolExecutor学习总结
    前提javaversion"1.8.0_25"池简述软件开发活动中,我们经常会听到数据库连接池、内存池、线程池等各种“池”概念,这些“池”到底是什么东西呢?程序的世界里,我们可以将池简单......
  • Java 线程池之ThreadPoolExecutor学习总结
    前提javaversion"1.8.0_25"池简述软件开发活动中,我们经常会听到数据库连接池、内存池、线程池等各种“池”概念,这些“池”到底是什么东西呢?程序的世界里,我们可以将池简单......
  • [dp 记录]szjudge#26 括号序列
    dp部分平凡,但是后面找最值是值得深思的。题意:给出两个由左右括号形成的字符串,求在长度最小的基础上字典序最小的合法括号序列,使给出字符串均为其子串。\(|s|,|t|\leq30......
  • 批量给UDP_Server发消息
    Server端     客户端:  运行结果: ......
  • NOIP2017 逛公园 记忆化搜索|dp(已过hack数据)
    30pts可以发现,\(k=0\)的情况下,问题转化为最短路计数,即从起点\(s\)到每个点有多少最短路。跑最短路的时候顺便维护\(ans[u]\),表示从\(s\)到\(u\)的最短路方案,讨论如下:①......