动态规划
「SCOI2008」奖励关-期望dp
· ✏️ 424 words · ☕ 1 mins read

系统将依次随机抛出 k 次宝物,每次你都可以选择吃或者不吃。宝物一共有 n 种,系统每次抛出这 n 种宝物的概率都相同且相互独立。

吃一次第 i 种宝物将得到 Pi 分,但并不是每种宝物都是可以随意获取的。第 i 种宝物有一个前提宝物集合 Si 。只有当 Si 中所有宝物都至少吃过一次,才能吃第 i 种宝物。注意,Pi 可以是负数。

假设你采取最优策略,平均情况你一共能在奖励关得到多少分值?


「SCOI2010」股票交易-dp+单调队列
· ✏️ 642 words · ☕ 2 mins read

lxhgww预测到了未来 T 天内某只股票的走势,第 i 天的股票买入价为每股 APi ,第 i 天的股票卖出价为每股 BPi (数据保证对于每个 i ,都有APiBPi ),第i 天的一次买入至多只能购买 ASi 股,一次卖出至多只能卖出 BSi 股。两次交易(某一天的买入或者卖出均算是一次交易)之间,至少要间隔 W 天;在任何时间一个人的手里的股票数不能超过 MaxP

在第 1 天之前,lxhgww手里有数目无限的钱,但是没有任何股票,在 T 天以后, lxhgww 能赚到的钱最多是多少?


「POI2014」PTA-单调队列
· ✏️ 473 words · ☕ 1 mins read

给定 n 个点的高度,规定从 1 点出发,跳到比高度小于当前点的点不消耗体力,否则消耗一点体力,最后到达 n 点。

q 次询问,每次询问有一个步伐限制 k ,求最少耗费的体力。


「CQOI2016」手机号码-数位dp
· ✏️ 785 words · ☕ 2 mins read

手机号码是一个有 11 位且不含前导 0 的数。满足条件手机号码的必须同时满足:号码中出现至少 3 个相邻的相同数字;号码中不能同时出现 84

给定两个数 LR ,统计出 [L,R]区间内所有满足条件的手机号码的个数。 LR 都是符合定义的手机号码。


「ZJOI2010」数字计数-数位dp
· ✏️ 689 words · ☕ 2 mins read

给定两个正整数 ab ,求在 [a,b] 中的所有整数中,每个数码(digit)各出现了多少次。


「SCOI2015」小凸玩密室-树形dp
· ✏️ 1774 words · ☕ 4 mins read

小凸和小方相约玩密室逃脱,这个密室是一棵有 n 个节点的完全二叉树,每个节点有一个灯泡。点亮所有灯泡即可逃出密室。

每个灯泡有个权值 ai ,每条边也有个权值 bi 。点亮第 1 个灯泡不需要花费,之后每点亮 1 个新的灯泡 v 的花费,等于上一个被点亮的灯泡 u 到这个点 v 的距离 Du,v ,乘以这个点的权值 av 。在点灯的过程中,要保证任意时刻所有被点亮的灯泡必须连通,在点亮一个灯泡后必须先点亮其子树所有灯泡才能点亮其他灯泡

请告诉他们,逃出密室的最少花费是多少。


「HAOI2009」毛毛虫-树形dp
· ✏️ 380 words · ☕ 1 mins read

对于一棵树,我们可以将某条链和与该链相连的边抽出来,称其为一个“毛毛虫”。求在这个树中点数最多的毛毛虫的点数。

n<300000


「NOI2009」二叉查找树-区间dp
· ✏️ 1050 words · ☕ 3 mins read

给定 n 个结点的数据值 Vi ,权值 Pi ,访问频度 Ti(Ti0) 。对于 i,jVij ,有 ViVj,PiPj

现令这 n 个点组成一颗二叉树,且满足 ,iV ,若 pi 的左子节点, qi 的右子节点,则 Vp<Vi<VqPi<Pp,;Pi<Pq 。可以证明,这样的二叉树是唯一的。点i 在树中的深度 Di 定义为它到根的距离加 1 。定义结点 i 的访问代价 Ei=Ti×Di 。可以修改每个点的权值为任意实数,其代价均为给定的正整数 K ,但需保证任两点权值仍互不相同。

现求上文所述二叉树中,其 i=1nEi+K 的最小值。


「ZJOI2007」时态同步-树形dp
· ✏️ 761 words · ☕ 2 mins read

给定一棵由 n 个节点构成的树。

在树上存在一个“激发器”,标号为 s 。当激发器工作后,电流会延边传向每一个相邻节点。而中间节点接收到电流后,会将该电流传向与它连接并且尚未接收到电流的节点。对于每条边 e ,电流通过它需要的时间为 te ,电流的转发可以认为是在瞬间完成的。最终,激电流将到达一些“终止节点”――接收电流之后不再转发的节点。

使用一次道具可以使得电流通过某条边的时间增加一个单位。请问最少使用多少次道具才可达到每一个“终止节点”同时收到电流?


「Luogu1043」数字游戏-dp
· ✏️ 806 words · ☕ 2 mins read

在你面前有一圈整数(一共 n 个),你要按顺序将其分为 m 个部分,各部分内的数字相加,相加所得的 m 个结果对 10 取模后再相乘,最终得到一个数 k 。游戏的要求是使你所得的 k 最大或者最小。