算法分析
单调队列
以i
结尾的f[i]
,滑动窗口的区间是[i - m,i - 1]
,单调队列维护的是该区间的最小值,由于滑动窗口不包含i
,因此f[i]
需要在while
上方进行更新
时间复杂度
Java 代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int N = 2 * 100000 + 10;
static int[] q = new int[N];
static int[] a = new int[N];
static int n,m;
static int[] f = new int[N];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s1 = br.readLine().split(" ");
n = Integer.parseInt(s1[0]);
m = Integer.parseInt(s1[1]);
String[] s2 = br.readLine().split(" ");
for(int i = 1;i <= n;i ++)
{
a[i] = Integer.parseInt(s2[i - 1]);
}
int hh = 0,tt = -1;
int res = 0x3f3f3f3f;
for(int i = 0; i <= n;i ++)
{
if(hh <= tt && q[hh] < i - m) hh ++;
f[i] = f[q[hh]] + a[i];
while(hh <= tt && f[q[tt]] >= f[i]) tt --;
q[++ tt] = i;
if(i >= n - m + 1) res = Math.min(res,f[i]);
}
System.out.println(res);
}
}
想请教下单调队列初始化的选择问题,还没理解清楚。什么时候 tt = 0 什么时候 取 -1 呢?谢谢
主要是看q[0]有没有特殊的含义吧,这题tt=0时,q[0]保持为0,就是为了数组前m个元素的f[i]=w[i],后面的元素才用到了dp转移方程