1 条题解
-
0
问题描述
我们需要同时完成两道料理的步骤序列,每个步骤有:
完成所需时间 或
时间限制 或 (必须在该时间前完成才能得分)
得分 或 (可能为负)
目标是最大化总得分。
关键观察
1.步骤顺序固定:每道料理的步骤必须按顺序完成
2.时间累加性:完成IOI盖饭前步的总时间为 ,完成JOI咖喱前步的总时间为
3.交错执行:可以在两道料理的步骤间切换,但每个步骤一旦开始就不能中断
数学模型
定义变量
设完成IOI盖饭前步和JOI咖喱前步的时刻为: ,
状态表示
考虑用动态规划,设 表示完成IOI前步和JOI前步的最大得分。
状态转移:
如果最后一步是IOI的第步:
$$dp[i][j]=dp[i-1][j]+\begin{cases} P_i ift_A(i)+t_B(i) \le S_i \\ 0 otherwise \end{cases} $$如果最后一步是JOI的第步:
$$dp[i][j]=dp[i][j-1]+\begin{cases} Q_j ift_A(i)+t_B(i) \le T_j \\ 0 otherwise \end{cases} $$因此:
$$dp[i][j]=max(dp[i−1][j]+scoreA(i,j), dp[i][j−1]+scoreB(i,j)) $$其中:
$$scoreA[i][j]=\begin{cases} P_i ift_A(i)+t_B(i) \le S_i \\ 0 otherwise \end{cases} $$$$scoreB[i][j]=\begin{cases} Q_j ift_A(i)+t_B(i) \le T_j \\ 0 otherwise \end{cases} $$优化挑战
直接DP的复杂度是,对于不可行。
优化思路
关键性质
注意到整个过程是沿着从到的网格路径,我们实际上是在选择一条路径最大化得分。
将问题重新表述:在二维网格上,从走到,只能向右或向上移动:
向右移动:可能获得(如果)
向上移动:可能获得(如果)
条件转化
对于IOI的第步,能在位置获得的条件是:
即存在一个的临界值,当时可以获得。
类似地,对于JOI的第步,能在位置获得的条件是:
即存在一个的临界值,当时可以获得。
新模型
定义:
(如果则)
(如果则)
现在问题转化为:在网格路径上,当路径经过且时获得,当路径经过且时获得。
进一步优化
考虑使用带优化的动态规划或数据结构优化。
设表示走到(对于某个固定的)的最大得分。
状态转移:
当增加时,对于所有,我们可以给加上。
这提示我们可以使用线段树或平衡树来维护数组,支持:
区间加(当增加时给的加)
前缀最大值查询和单点更新(处理向上移动的转移)
算法框架
预处理前缀和和
预处理临界值和
使用数据结构维护DP数组,按从小到大处理
最终答案为
时间复杂度
预处理:
主算法:(使用合适的数据结构)
这样可以在的范围内解决问题。
总结
本题的关键是将原问题转化为网格路径问题,通过分析条件发现可以预处理临界值,然后使用数据结构优化动态规划。这种"二维网格路径+条件得分+数据结构优化"的思路在JOI等竞赛中很常见。
核心公式总结:
时间约束: 或
临界值:
状态转移:
- 1
信息
- ID
- 4337
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者