每个窗口的最大减最小
补全 main:对 {4, 2, 6, 1, 5, 3} 的每个长度为 3 的窗口,算「最大值 − 最小值」,输出其中最大的那个。window_max、window_min 都已经写好了。 本节模型:window_max / window_
什么样的 DP 能这样优化
形如 dp[i] = max(dp[j]) + w、且 j 落在一个随 i 滑动的区间里的转移,可以用【0】优化。 本节模型:jump_best——从第 0 格出发,每次往右跳 1~k 格,得分是踩过的格子之和,求跳到最后一格的最高得分。d
优化后的复杂度
第 1 步:下:跳到这格的最好成绩 第 2 步:起点就是它自己 第 3 步:前 2 格里挑最大的接过来 第 4 步:前 2 格里挑最大的接过来 第 5 步:前 2 格里挑最大的接过来 第 6 步:前 2 格里挑最大的接过来 第 7 步:前
跳格子的最高分
运行下面这段程序: 本节模型:jump_best——从第 0 格出发,每次往右跳 1~k 格,得分是踩过的格子之和,求跳到最后一格的最高得分。dp[i] 要从前 k 格里 dp 最大的那一格转移过来,这个「区间最大」交给单调队列。 #inc
只能一格一格跳
运行下面这段程序: 本节模型:jump_best——从第 0 格出发,每次往右跳 1~k 格,得分是踩过的格子之和,求跳到最后一格的最高得分。dp[i] 要从前 k 格里 dp 最大的那一格转移过来,这个「区间最大」交给单调队列。 #inc
补全:从最好的那格转移
补全 jump_best:dp[i] 要接在前 k 格里 dp 最大的那一格(队首)后面。补全后输出最高得分。 本节模型:jump_best——从第 0 格出发,每次往右跳 1~k 格,得分是踩过的格子之和,求跳到最后一格的最高得分。dp[
补全:保持队首最大
补全 jump_best:新的 dp[i] 入队前,队尾 dp 不比它大的都弹掉。补全后输出最高得分。 本节模型:jump_best——从第 0 格出发,每次往右跳 1~k 格,得分是踩过的格子之和,求跳到最后一格的最高得分。dp[i] 要
补全:跳不过来的要出队
补全 jump_best:队首下标离 i 超过 k 格就跳不过来了,要出队。补全后输出最高得分。 本节模型:jump_best——从第 0 格出发,每次往右跳 1~k 格,得分是踩过的格子之和,求跳到最后一格的最高得分。dp[i] 要从前
补全:起点的得分
补全 jump_best:起点第 0 格一定要踩,dp[0] 就是 a[0]。补全后输出最高得分。 本节模型:jump_best——从第 0 格出发,每次往右跳 1~k 格,得分是踩过的格子之和,求跳到最后一格的最高得分。dp[i] 要从前
最大矩形用什么结构
在柱状图里找最大矩形面积,最优做法用【0】。 本节模型:largest_rect 用单调栈求柱状图最大矩形,末尾放一根高 0 的哨兵柱子。