[Vijos1617] 超级教主(DP + 单调队列)


传送门

设 f[i] 表示吃完 f[i] 及其以下的能量球后所剩下的能量。

所以 f[i] = max(f[i], f[j] + (sum[i] sum[j]) i * 100) ( 0 <= j < i )

但这是 O(n2) 的,肯定超时,

把上面的式子变换以下得到f[i] = max(f[i], (f[j] sum[j]) + sum[i] i * 100) ( 0 <= j < i )

也就是说,f[i] 只与 f[j] sum[j] 有关,sum[i] i * 100 可看做常数,

要想使 f[i] 最大,需要让 f[j] sum[j] 最大,

可用单调队列维护最大 f[j] sum[j],

如果 f[q[h]] < i * 100 说明能量不够跳到当前点,而能量跳不到当前点肯定也跳不到后面的点,h++

——代码

1 #include <cstdio> 2 3 const int MAXN = 2000001; 4 int n, m, h = 1, t; 5 int sum[MAXN], q[MAXN], f[MAXN]; 6 7 int main() 8 16 t++; 17 for(i = 1; i <= n; i++) 18 24 printf("%d", f[n]); 25 return 0; 26 }
View Code



上一篇:[luoguP1082] 同余方程(扩展欧几里得)

下一篇:[HDU2136] Largest prime factor(素数筛)


DP 单调队列
Copyright © 2002-2019 k262电脑网 www.k262.cn 皖ICP备2020016292号
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!QQ:251442993 热门搜索 网站地图