ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【题解】$test0627 \ B$ - 树形 $dp$ - 基环树

2020-06-28 16:55:27  阅读:248  来源: 互联网

标签:min 题解 线段 test0627 tree 代价 节点 dp


题目描述

\(\\\)


\(\\\)

\(Solution\)

这题目描述就离谱bushi

考场翻来覆去读了几遍题没看懂kkkkk

大概翻译一下题目意思就是:给你一个序列 \(d\),如果当前读到 \(d_i\) ,就跳到 \(d_i + a_i\) ,目标是最后正好跳到 \(n + 1\) ;对于 \(a_i\) 可以修改为 \(a_i +- y\) ,修改代价为 \(y(y >= 0)\) ;求最小代价。现在有一棵树,对于从根节点到叶子节点的每条链都看做一个序列,求出所有最小代价。

感谢\(\mathtt{I}\)\(\mathtt{\color{red}{makf}}\) 给我讲了好几遍这道题,终于明白力!!!

首先先来看序列怎么做

设 \(dp[i]\) 表示跳到了 \(i\) 的时候的最小代价

若当前 \(dp[i]\) 已知,设 \(j = i + a_i\) ,则 \(dp[j] = min(dp[j], dp[i])\) ,因为可以直接跳到,不需要修改 \(a_i\)

那么来考虑修改,则 $$dp[j - x] = min(dp[j - x], dp[j] + j - x)$$ $$dp[j + x] = min(dp[j + x], dp[j] + x - j)$$

于是可以 \(O(n^2)\) 顺利解决,接下来考虑优化

先只考虑 \(dp[j] = min(dp[j], dp[i] + i - j)\) 这一种转移(就是上面写的那个式子,改了一下变量),往后推的和这个差不多

想把 \(O(n^2)\) 降为 \(O(n\log n)\) ,正确做法是在脑子里随便找一种数据结构试试可不可行

直接给结论:开一颗线段树,在第 \(i\) 个叶子节点存的是 \(tree[i] = dp[i] + i\) ,维护最小值

为什么要存这个?其实很巧妙

看看上面的转移方程,如果先不考虑取 \(min\),即 $$dp[j] = dp[i] + i - j$$

得到了 \(dp[j]\) 后我们要存进线段树中,将方程两边加上 \(j\) 就变成了 $$tree[j] = dp[j] + j = dp[i] + i - j + j = dp[i] + i = tree[i]$$

发现直接可以用线段树中的 \(tree[i]\) 更新 \(tree[j]\) !

标签:min,题解,线段,test0627,tree,代价,节点,dp
来源: https://www.cnblogs.com/Bn_ff/p/13203529.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有