题目链接
题意分析
自己树形DP果然是弱到家呀
这是一道赤果果的树形\(dp\)问题
我们这样设状态
\(cdy[now][i]\) 表示当前的以\(now\)为根子树我们已经覆盖并且又向上覆盖了\(i\)层的最小代价
(\(0\)时包括\(now\))
\(wzy[now][i]\) 表示当前的\(now\)向下\(i\)没有为被覆盖的代价
(\(0\)时\(now\)被覆盖了 \(1\)时\(now\)单独算一层 没有被覆盖)
然后如果当前点是关键点的话
\(cdy[now][0]\)以及\(wzy[now][0]\)初始化为\(val[now]\)
表示我们只监视这一层的代价
同时\(cdy[now][1...d]\)初始化为\(val[now]\)
表示我们安插了这个节点之后 范围内我们都可以更新
然后我们\(dp\)的时候
\[cdy[now][i]=min(cdy[now][i]+wzy[v][i],wzy[now][i+1]+cdy[v][i+1])
\]
首先左边表示 我们并入以\(v\)为根子树我们刚好可以加入\(wzy[v][j]\)
表示我们可以由\(dp[now][i]\)覆盖\(wzy[v][i]\)未被覆盖的范围
然后右边表示\(wzy[now][i+1]\)没有覆盖的范围我们可以由\(cdy[v][i+1]\)覆盖到下面以及上面
然后根据贪心的话
上面我们覆盖的越少 代价至少不会多
所以
\[cdy[now][j]=min(cdy[now][j],cdy[now][j+1])
\]
下面我们没覆盖的越多 代价至少不会多
\(wzy[now][j]=min(wzy[now][j],wzy[now][j-1])\)
然后对于\(wzy[now][i]\)
我们令
\[wzy[now][i]+=wzy[v][i-1]
\]
表示并入子树
最后\(wzy[now][0]\)就是答案
CODE:
#include
#include
#include
#include
#include
#include
#include
#include
#include
HEOI 2019 RP++