r u n run run 题解
这道题的解题方法是动态规划。
对于 90 90 90分的方法
我们设
f
i
f_i
fi表示到了编号为
i
i
i的休息点的最大价值。
则
f
i
=
max
j
<
i
,
a
i
−
a
j
≤
m
f
j
+
a
i
f_i=\max_{j<i,a_i-a_j\leq m}{f_j+a_i}
fi=maxj<i,ai−aj≤mfj+ai。
那么我们就可以直接用动态规划的方法求出答案,答案是
max
i
=
1
n
f
i
\max_{i=1}^{n}{f_i}
maxi=1nfi。
时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)。
对于满分的方法
题目要求序列
a
a
a是单调递增的,那么我们可以预处理出一个
k
i
k_i
ki表示
min
a
i
−
a
j
≤
m
,
j
<
i
j
\min_{a_i-a_j\leq m,j<i}{j}
minai−aj≤m,j<ij。
那么其实可以把转移方程简化,得
f
i
=
max
j
=
k
i
i
−
1
f
j
+
a
i
f_i=\max_{j=k_i}^{i-1}{f_j+a_i}
fi=maxj=kii−1fj+ai。
这样就可以过所有数据了。
时间复杂度不稳定,只要数据不毒瘤,就可以满分。
最坏情况为
O
(
n
2
)
O(n^2)
O(n2)。
进阶:单调队列优化
我们尝试对上面的方法进行优化。
首先我们发现转移方程其实可以变为
f
i
=
max
j
=
k
i
i
−
1
f
j
+
a
i
f_i=\max_{j=k_i}^{i-1}{f_j}\:+a_i
fi=maxj=kii−1fj+ai。
那么就可以用单调队列来优化了。
不会单调队列的话,可以自己去学一学。
时间复杂度为
O
(
n
)
O(n)
O(n)。
但是具体测试时发现单调队列比上面的方法慢了一点点,可能是常数比较大。