run 题解

23 篇文章 0 订阅
1 篇文章 0 订阅

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,aiajmfj+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} minaiajm,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=kii1fj+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=kii1fj+ai
那么就可以用单调队列来优化了。
不会单调队列的话,可以自己去学一学。
时间复杂度为 O ( n ) O(n) O(n)
但是具体测试时发现单调队列比上面的方法慢了一点点,可能是常数比较大。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值