s1

【简洁易懂】CF372C Watching Fireworks is Fun dp + 单调队列优化 dp优化 ACM codeforces

柔情痞子 提交于 2019-11-26 19:58:19
题目大意 一条街道有 \(n\) 个区域。 从左到右编号为 \(1\) 到 \(n\) 。 相邻区域之间的距离为 \(1\) 。 在节日期间,有 \(m\) 次烟花要燃放。 第 \(i\) 次烟花燃放区域为 \(a_i\) ,幸福属性为 \(b_i\) ,时间为 \(t_i\) 。 \(t_i \leqslant t_{i+1}\) 如果你在第 \(i\) 次烟花发射时在 \(x(1\leqslant x \leqslant n)\) 处,你将获得幸福值 \(b_i - | a_i - x |\) (请注意,幸福值可能是负值)。 你可以在单位时间间隔内移动最多 \(d\) 个单位,但禁止走出主要街道。 此外,您可以在初始时刻(时间等于 \(1\) 时)处于任意区域,并希望最大化从观看烟花中获得的幸福总和。 输出最大的幸福总和。 题目解答 本题是单调队列优化 \(DP\) 的经典题目。 设 \(dp[i][j]\) 表示第 \(i\) 次烟花时你位于 \(j\) 处所能获得的最大的幸福总和。 而第 \(i-1\) 次烟花燃放到第 \(i\) 次烟花燃放所能移动的最大距离为 \(h=(t_i-t_{i-1})*d\) 。 所以该次燃放后可能获得的幸福总和由上一次位于 \([j-h,j+h]\) 处的几种情形得到。 且 \(dp[i][j]=\max\{dp[i-1][k]+b[i]-