DP 总结想写啥写啥。

妈的,模拟赛就我不会 dp,举报了。

插入式 dp / 适用于排列的一类技巧

考虑钦定 i 这一个维度是比 i1 这一个维度劣的,事实上这是增量式的 dp 方式。

  • bamboo

删掉一个数会有 hi+hi1+hi+1 的代价。求删完 n 个数的方案数。

首先不要考虑 hi 的代价,考虑 ii1 的相对顺序。事实上这就是先考虑 i1 的傻狗位置,然后就让 i 挑一个位置,前面的那些傻狗数都挪位就好了,实质上是对若干状态的隐式的转移。

但这其实不仅仅是这个,还有一类称为“连续段”的 dp 技巧。

  • P5999 [CEOI2016] kangaroo

考虑 fi,j 表示前 i 个数分 j 个段。

考虑称这些满足题目条件的为一个 “段”。

显然是可以:

  • 新开一段,注意首尾。

  • 放在一段的首尾:但是这样左右符号必然不同所以是不行的。

  • 连接两段。

注意对于首尾的限制,感觉不如摩天大楼。

  • CF704B Ant Man
// 考虑插入 dp 加费用提前计算,即拆分贡献。
// 先分成四类贡献 :
/*	
	左边比 i 小:xi + ai
	左边比 i 大:-xi + bi
	右边比 i 小:xi + ci 
	右边比 i 大:-xi + di
*/ 
// 对于 s : 新建一段,右边比他大。插入一段,右边比他小。
// 对于 t : 新建一段,左边比他大。插入一段,左边比他小。
// 普通点 : 新开一段,左右都大,合并两端,左右都小,放左边,右边小左边大,放右边,左边小右边大
// 注意到这不是边上的点,所以肯定有贡献。 
// 但其实可以 bi - xi, ai + xi 之类的。 

模拟赛题

整体 dp

大致是面对限制之类的用一维描述奇特的约束。通常需要线段树合并。

命运已经全忘了。

P4577 [FJOI2018] 领导集团问题

注意到子树内不同子树是没有区别的。然后我们考虑整体 dp.

fu,j 的描述很简单,考虑如何转移。

fu,i=max{fu,i+maxjifv,j,fv,i+maxjifu,j}

fu,au=1+maxwaufv,w

前面那一个可以考虑线段树维护后缀最大值,但是需要区间加 tag.

可以做一下 yusland.

CF1455G Forbidden Value

考虑把 0 放在外边当根,然后我们可以直接整体 DP,记 fx,k 为走出 x 的子树值为 k 的方案。

set 操作:

fx,k=minfy,i

fx,i=fx,i+vy(ik)

可以使用全局加,单点修改维护,注意顺序。

if 操作:

fx,k=fx,k+fy,k

fx,i=min{fx,i,fx,k+fy,i}

注意顺序,单点修改,全局加,线段树合并。

CF671D Roads in Yusland 测你妈,忘了怎么写??

动态 dp

总所周知,序列上的动态 dp 谁都会。

就是最大字段和那个题 :

GSS3 - Can you answer these queries III

直接 DP。

考虑 fi 表示以 i 结尾的最大和,gi 为总的最大和。

fi=max{fi1+ai,ai}

gi=max{gi1,fi}

|fi1gi10||aiai0aiai0|=|figi0|

注意这里其实是定义了个 max+ 卷积。

P6021 洪水。

写了个 LCT,考虑 dp.

fu=min{au,fv}

然后拆掉虚实儿子。

fu=min{au,gu+fv}

考虑 min + 卷积。

构造矩阵答案是 |fu| 的话,显然很难。

这个时候考虑构造 |fi0| 这个是很经典的 trick.

然后我们就有 :

|guau 00 ||fhu 0 |=|fu 0 |

这里讲一下动态 dp 的注意的点 :

  • 全局的动态 dp 不用换根 lct
  • 可以适当重载运算符
  • 注意 lct 的 pushup 的中序遍历。
  • access 的过程是加上变虚的儿子,减去变实的儿子。

LCT 常数好大 /kk.

CF1609E William The Oblivious

你妈唐题,注意写成向量转移的形式即可。

wqs 优化 dp

通常可以理解为答案函数是有凸性的,由于二阶导是恒为正或者负的.

所以我们可以尝试二分这个函数的导数,让导数作用在转移内,可以计算出坐标,知道了导数对应的坐标后可以继续二分。

拜谢 gaosichensb。

  • P4383 [八省联考 2018] 林克卡特树

不会其他题,征途过于简单了 (bushi)。

割掉 k 条边,然后连上 k 条边,求树的直径的长度最大值。

显然就是割剩了 k+1 个连通块,然后直接拼起来,最后直接算就好了。

变成了选取树上 k+1 条不相交路径。考虑 wqs 二分,然后变成随便选若干条路径就好了。

考虑 dp,然后把 k 这个东西塞进 dp 答案里的 pair, 目前还比较自然。

然后分三类情况讨论,第一是自己还没有被接上,另一种是接上了一条,另一种是全接上了。

f[u][2] = max(f[u][2], max(f[u][2] + f[v][0], f[u][1] + f[v][1] + edge[i] + tmp));

f[u][1] = max(f[u][1], max(f[u][1] + f[v][0], f[u][0] + f[v][1] + edge[i]));

f[u][0] = max(f[u][0], f[u][0] + f[v][0]);

f[u][0] = max(f[u][0], max(f[u][1] + tmp, f[u][2]));

只可意会不可言传。

决策单调性

咕一下。

杂题。

CF55D Beautiful numbers

P6754 [BalticOI 2013 Day1] Palindrome-Free Numbers

CF449D Jzzhu and Numbers

P4127 [AHOI2009]同类分布

CF628D Magic Numbers

CF1612F Armor and Weapons

CF464D World of Darkraft - 2

CF1144G Two Merged Sequences

CF441E Valera and Number

CF704B Ant Man

2023.7.11 的听课笔记

[CEOI 2009] Photo

key observation : 保留 x 相同的时候,y 最大的值。

然后可以考虑建出笛卡尔树。

fi,j,k 表示覆盖了 [i,j] 中高度 k 的最小个数。

显然有 fi,j,kfi,j,k+1

合并两个区间,或者在 [i,j] 间放一个尽量大的矩形。

目标状态 f1,n,1

path

差不多想出来了?

tricky

key observation : 考虑这个能够走到的是一个矩形,所以我们还是别用折线表示了 ()

fi,j,n,m,03

这个我们可以考虑二维部分和计算,尺寸小的先计算,大概是比较有前途的。

可惜不能直接把 ppt 蹦下来,无语住了。

P2943

我超,原!首先颜色数 n

怎么证明操作不相交?这个其实是显然的,必然有一端会变小,所以说必然是首位相接的几段,然后单调维护最大的一些位置即可。

CF856D Masha and Cactus

考虑直接在 lca 上选链。

然后就是直接加上末端的那些没被覆盖的和其他子树求 max。

我们考虑子树求和,然后可以直接乱算即可,好典。

然后树剖维护即可。

ftiasch 's Contest #4 Data Structure You 've Never Heard Of : 求不降转化为或运算,然后可以考虑做高维前缀和,很神仙。

[POI 2014] tourism : 真难吧。

posted @   Cust10  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示