QOJ 9220 Bus Analysis 思路分析
QOJ 9220 Bus Analysis 思路分析
朴素想法
额,好吧,这个题我还真没有什么想法。。。
正解思路
首先,由于票价都是偶数,不妨先除以二,最后再乘回去就行。
考虑一个确定的检票员集合 \(T=\{t_1,t_2,t_3\dots t_m \}\),对于集合 \(T\) 考虑构造一个 DP 求对应的答案。先确定有哪些限制:有且仅有当前手中的票的有效时间这一个限制,但由于 \(t_i\in [1,10^9]\),可是要求的票价最多只有 \(7.5\times 10^4\),可以当做状态,于是考虑价值维 DP,有
\[f[i][j] \text{表示已经通过前 $i$ 个检票员,当前花费了 $j$ 元时,手中的票剩余有效时间}
\]
对于转移,进行分类讨论,设 \(d=t_i-t_{i-1}\):
- 当前站没有检票员:\(f[i][j]=\max(0,f(i-1,j)-d)\)
- 当前站有检票员,要求 \(f[i][j] > 0\),对于两种价格,分别有 \(f[i][j+1]=\max(f[i][j+1],f[i][j]+20)\),\(f[i][j+3]=\max(f[i][j+3],f[i][j] + 75)\)
合并一下并进行滚动数组优化,得到
\[f_{new}[j]=\max(f_{old}[j],f_{old}[j-1]+20,f_{old}[j-3]+75)
\]
若处理完第 \(i\) 个站点后,当前最小代价为 \(w\),那么为了保证之后无论遇到怎样的检查员站点,我们仍然能够正确进行最优转移,需要保留哪些“比 \(w\) 多一点”的方案?显然 \(w,w+1,w+2\) 是必须的,而 \(w+3\) 以上的完全可以在后续转移中用更优的方式转移,因此只用记录 \(w,w+1,w+2\),\(w+3\) 在转移中记录即可。
于是我们可以得到一个三元组 \(A,B,C\) 分别表示 \(w,w+1,w+2\) 时剩余的时间,那么我们得到了 \(f\) 最终最有用的信息,也就是内层 DP 形成的 DFA 的状态。
对于这个 DFA,其输入串是一个 01 串表示一个车站是否有检票员。考虑 DFA 的 0 转移和 1 转移:
- 0 转移情况:\((A,B,C)⟶(\max(0,A−d),\max(0,B−d),\max(0,C−d))\);
- 1 转移情况,先令 \(r=\max(0,A−d)\),\(r_1=\max(0,B-d)\),\(r _2=\max(0,C-d)\),然后不妨用一个小的 DP 进行这里的转移。设 \(g_i\) 表示在当前站通过检查后,相对于旧的最优费用 \(w\),额外花 \(j\) 块钱时,最多还能撑多久。有 \(g_j=\max(g_j,g_{j-1}+20,g_{j-3}+75)\),由于我们只需要 \(w,w+1,w+2\),所以 \(j\) 只需要跑到 \(5\) 即可
那么考虑据此构造一个外层 DP 用于快速计算全部 \(2^N\) 组串的答案。
设 \(F_i[A][B][C]\) 表示处理完前 \(i\) 个站之后,有多少种检查员方案会使内层 DP 恰好处于状态 \((A,B,C)\)。
- 外层 0 转移:假设 \(F_i[A][B][C]=X\) 为有 \(X\) 种检票员进入状态 \((A,B,C)\),若 \(i+1\) 没有检票员,则
\[F_{i+1}[A'][B'][C']+=X
\]
- 外层 1 转移:多一个系数 \(k\),为 \(k\times X\)
于是就得到了最终结果。

浙公网安备 33010602011771号