每个窗口的最大减最小

补全 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 的哨兵柱子。

开始练习 →