P4870 [BalticOI 2009] 甲虫 (Day1)

P4870 [BalticOI 2009] 甲虫 (Day1)

题目描述

译自 BalticOI 2009 Day1 T1「Beetle

有一只甲虫处于一根水平的树枝。因为他沉迷数学无法自拔,所以他觉得很像是在 \(x\) 轴上。

在同一根树枝上,还有 \(n\) 滴露水。每滴露水占用 \(m\) 个单位的水分。相对于甲虫的位置,他们的坐标分别是 \(x_1,x_2,\dots,x_n\)

显然,这一天将会骄阳似火。每过一个时间单位,就会有一个单位的水分从每一滴露水流失。这只甲虫受尽了烈阳的折磨,以至于每当它碰到一滴露水都能瞬间喝完。在每个时间单位中它能移动一个单位的距离。

所以你要写一个程序,根据露水的坐标,计算出甲虫最多能喝到的水。

输入格式

第一行,两个整数,\(n\)\(m\)

以下 \(n\) 行,每行一个整数,表示露水的坐标 \(x_1,x_2,\dots,x_n\)

输出格式

输出一行,表示甲虫最多能喝到的水

输入输出样例 #1

输入 #1

3 15
6
-3
1

输出 #1

25

说明/提示

\(0 \le n \le 300,1 \le m \le 1,000,000,-10,000 \le x_1,x_2,\dots,x_n \le 10,000,\) 对于所有 \(i \ne j,x_i \ne x_j\)

思路

数据范围一眼区间dp。

这道题和那道 sue 的小球很像,不管其它的,直接设 \(f_{i,j,0/1}\) 表示弄完 \([i,j]\) 之间的最少损失数,但是甲虫不见得要把这些全部喝完,而且这个露水也不会变成负数,所以在区间dp之前还应枚举一个 \(i\) 表示需要吃到多少个露水。

那么转移方程式了然:

\[f_{l,r,0} = \max \left( f_{l+1,r,0} - (a_{l+1} - a_{l}) \times s, \ f_{l+1,r,1} - (a_{r} - a_{l}) \times s \right) + m \]

\[f_{l,r,1} = \max \left( f_{l,r-1,1} - (a_{r} - a_{r-1}) \times s, \ f_{l,r-1,0} - (a_{r} - a_{l}) \times s \right) + m \]

其中 \(s\) 是还未吃掉的露水的数目。

时间复杂度 \(O(n^3)\)

posted @ 2025-07-29 16:26  shencheng4014  阅读(9)  评论(0)    收藏  举报