1 solutions
-
0
题目大意
这道题目要求在坐标的x轴上选择若干条互不重叠的线段,使得所选线段的总价值最大
思路
每条线段由中点的横坐标、半径长度和价值决定。具体来说,线段的起点和终点分别为 p[i] - r[i] 和 p[i] + r[i]。选择的线段必须满足任意两条线段不重叠,即对于任意两条线段 i 和 j,要么 p[i] + r[i] <= p[j] - r[j],要么 p[j] + r[j] <= p[i] - r[i]。 为了求解这个问题,我们可以采用动态规划的方法。以下是具体的步骤和分析:
-
线段的表示与排序 首先,我们需要将每条线段表示为一个结构体,包含起点、终点和价值。然后,将所有线段按照结束位置(即 p[i] + r[i])从小到大排序。这一步的目的是为了在后续的动态规划中,能够方便地找到不重叠的线段。
-
动态规划的状态定义 定义一个数组 dp,其中 dp[i] 表示前 i 条线段中,选择互不重叠的线段所能获得的最大总价值。
-
状态转移方程 对于第 i 条线段,有两种选择:
不选择第 i 条线段:此时 dp[i] = dp[i-1]。 选择第 i 条线段:则需要找到最后一条不与第 i 条线段重叠的线段 j,此时 dp[i] = dp[j] + w[i]。 最终,dp[i] 取这两种情况的最大值。
-
寻找不重叠的线段 为了高效地找到最后一条不与当前线段重叠的线段 j,我们可以使用二分查找。因为线段已经按照结束位置排序,二分查找可以在较短的时间内完成。
-
初始化与边界条件 dp[0] = w[0],表示只选择第一条线段时的最大价值。 对于 i > 0,按照状态转移方程逐步计算 dp[i]。
-
最终结果 最终的答案为 dp[n-1],即选择前 n 条线段中,互不重叠的线段所能获得的最大总价值。
代码
Java代码
Python代码
C++代码
Js代码
-
- 1
Information
- ID
- 7
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 7
- Tags
- # Submissions
- 37
- Accepted
- 10
- Uploaded By