文章目录
引入
acwing154 滑动窗口
应用
闫氏最优化问题分析法
135 最大子序和
题目:
输入一个长度为 n 的整数序列,从中找出一段长度不超过 m 的连续子序列,使得子序列中所有数的和最大。
题解:
我们把这个问题的集合分成n份,第k份表示以A[k]结尾的最大连续子序列是多少
我们以A[k]结尾为例,我们从A[k]开始向前延申长度j,j的范围是[1,m],我们引入前缀和,S[k]表示前k个数的前缀和,那么图中长度为j,以A[k]结尾的连续子序列答案就是:S[k]-S[k-j],
现在S[k]是固定的,我们要让值最大,就要使得S[k-j]最小,就相当于在长度为m的区间(即从[k-m,k])内找最小值,这不就把问题引入到滑动窗口
时间复杂度:O(n)
1088.旅行问题
题解
题目:
一个环形公路,由n个车站,每个站有若干升汽油(有的站可能油量为零),每升油可以让汽车行驶一千米。
从某个车站出发,一直按顺时针(或逆时针)方向走遍所有的车站,并回到起点。
在一开始的时候,汽车内油量为零,John 每到一个车站就把该站所有的油都带上(起点站亦是如此),行驶过程中不能出现没有油的情况。
任务:判断以每个车站为起点能否按条件成功周游一周。
题解:
破环成链,链复制
我们从点i出发,能否到i+1,取决于i的油量是否大于等于d[i],即i到i+1的距离
所有我们规定数组w[i]=a[i]-d[i]
s[i]表示w[i]的前缀和
从i出发到j,这个过程的油量始终>=0,等价于在[i,i+n-1]中,对任意的j,i<=j<=i+n-1,均有s[j]-s[i-1]>=0,如果min(s[j]-s[i-1])>=0,就说明能到达,其中i是固定的,所有就是找s[j]的最小值。
这就把问题引到滑动窗口,这既是单调队列优化
题目中说顺时针或逆时针有一个就行,所以我们还要倒着来遍单调队列