点个赞评个论喵。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
贪心
解决最值问题。
要求单步最值可以推出总体最值。
交换论证验证贪心策略:
在最优解中选择两个相邻元素交换,若结果不会更佳,则排序方式正确。
1.确定排序策略。
2.假设一种情况与排序方式不同。
不同方案例子: AAA 在 BBB 的前面,且 TA>TBT_A > T_BTA >TB 。
将 A,BA,BA,B 位置互换,获得新方案 S′S'S′。
计算两者差距。
· 若 S′S'S′ 的结果不比 SSS 的差,说明贪心策略正确。
· 否则贪心策略是错误的。
举例说明:
交换前:前 kkk 个人是 W,W,⋯ ,W+TaW,W,\cdots,W+T_aW,W,⋯,W+Ta ,后面每人要等 Ta+TbT_a+T_bTa +Tb 。
交换后:前 kkk 个人是 W,W,⋯ ,W+TbW,W,\cdots,W+T_bW,W,⋯,W+Tb ,后面每人要等 Ta+TbT_a+T_bTa +Tb 。
交换更优,那么贪心策略是正确的。
一般适用于 N≤106N \leq 10^6N≤106 的情况。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
反悔贪心
普通:一旦做出选择永不回头。
反悔:带有限制的最优选取。
即可能在后期知道早期选择是错误的。
反悔贪心和 DP 的区别:
反悔贪心的前提是每个物品占用的空间是等价的,若不是等价的,则必须使用 DP 解决。
反悔贪心的实现:
1.按物品的某个维度排序。
2.维护小根堆,存已经选入方案的收益值。
3.考虑每个物品:
· 当前仍有空位:继续选,收益入堆。
· 没有空位:考虑当前收益是否大于堆顶,若是,反悔:弹出堆顶,将当前物品进堆。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二分
本质枚举,考虑好枚举对象和范围。
二分答案解决要求 最大值最小、最小值最大 的问题。
二分答案步骤:
1.确定二分对象。
2.确定改变区间的方式。
3.写 check\mathtt{check}check 函数,使用其他算法判断能否做到。
二分答案的时间复杂度 =check= \mathtt{check}=check 函数时间复杂度 ×logn\times \log n×logn。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DP
线性DP
前 iii 个满足题目条件的值。
一般来说题目需要哪些属性的描述就需要几维下标。
区间DP
状态设计:区间长度为 lenlenlen 时,起点为 iii,分割点为 kkk 时满足题目的属性。
树形/换根DP
状态设计:以 uuu 为根的子树满足的属性。
状压DP
状态设计:保存状态 sss 时,满足条件的属性。
例题
[CSP-J 2022] 上升点列
状态设计:定义 dpi,jdp_{i,j}dpi,j 为以 iii 结尾且使用 jjj 个加点机会的最大值。
转移时枚举转移来源,此时需要 ∣x1−x2∣+∣y1−y2∣−1\lvert x_1-x_2\rvert+\lvert y_1-y_2\rvert-1∣x1 −x2 ∣+∣y1 −y2 ∣−1 个额外点。
随后再枚举使用自由点的个数,暴力转移即可。
最后统计最大值。
[CSP-J 2019] 纪念品
注意到可以进行 t−1t-1t−1 轮完全背包:
金币数为容量,今天价格为消耗,明日价格为价值。
有趣的家庭菜园3
状态设计:前 iii 盆花,最后一盆放第 jjj 号颜色的最小交换次数。
考虑到交换来源需要计算前面放了多少盆不同颜色的花,考虑使用 dpi,j,k{dp_{i,j,k}}dpi,j,k 表示放了 iii 盆红色,jjj 盆绿色,kkk 盆黄色。
最后摆放的是颜色 ccc (c∈{0,1,2})\left(c\in\{0,1,2\} \right)(c∈{0,1,2})。