码迷,mamicode.com
首页 > 其他好文 > 详细

DP从入土到入门

时间:2020-06-13 19:34:16      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:play   spl   状态   isp   不能   containe   复杂度   分类   other   

做一大堆DP


P5017 摆渡车

详见 P5017 摆渡车 - Luckyblock

算法一

\(f_i\)\(i\) 时间发车,发车时等待的时间和的最小值。则显然有:

\[f_i = \min_{j\le i-m}(f_j + \sum_{j < t_k \le i}^{n}{(i-t_k)}) \]

对于每个 \(f_i\),当在 \(i\) 时刻时发第一班车,\(f_i\)最大,则其初始值为:

\[f_i = \sum_{t_k<i}^{n} {(i-t_k)} \]

为保证载上所有人,最后一班车需在 \([t_{max}, t_{max}+m)\)内发车,则:

\[ans = \min_{i=t_{max}}^{t_{max}+m}(f_i) \]

前缀和优化,设 :

\[cnt_i=\sum\limits_{t_k\le i} 1,\ pos_i = \sum\limits_{t_k\le i}{t_k} \]

对于上式中的 \(\sum\limits_{j < t_k \le i}{i-t_k}\),有:

\[\sum\limits_{j < t_k \le i}{i-t_k} = (cnt_i-cnt_j)\times i - (pos_i-pos_j)\]

替换状态转移方程。

优化转移方程,对于状态转移方程:

\[f_i = \min_{j\le i-m}(f_j + (cnt_i-cnt_j)\times i - (pos_i-pos_j)) \]

显然,若 \(j\le i-2m\),则在 \(j+m\) 时刻可多发一班车,不影响在 \(i\) 时刻发车,且答案不会变劣。
即:停车时间 \(i- (j+m) < m\)

故转移方程可替换为:

\[f_i = \min_{i-2m\le j\le i-m}(f_j + (cnt_i-cnt_j)\times i - (pos_i-pos_j)) \]

减去无用状态。

\(cnt_i=cnt_{i-m}\),说明时间段 \([i-m,i]\)内没有需要坐车的人。
则在 \(i-m\) 时刻发车,在 \(i\) 时刻不发车,不会使答案变劣,\(f_i\) 是一个无用状态。

则可将状态转移方程改为:
\(f_i = \begin{cases}f_{i-m} &cnt_i=cnt_{i-m}\\ \min_{i-2m\le j\le i-m}(f_j + (cnt_i-cnt_j)\times i - (pos_i-pos_j))& \text{otherwise}\end{cases}\)

当满足 \(t_i = t_{i-1}+m\) 时,有用的位置最多,为 \(nm\) 个。

复杂度 \(O(nm^2 + t)\),期望得分 \(100\text{pts}\)


算法二

由算法一,停车时间 \(i- (j+m) < m\)
车往返一次时间 \(m\),则人等车时间 \(< 2m\)

\(f_{i,j}\) 表示第 \(i\) 个人,等待时间为 \(j\),且前 \(i\) 个人已到达的时间最小值。

初始值 \(f_{1,i} = i\)

分类讨论:

  1. \(t_{i+1} \le t_{i+1} + j\),则第 \(i+1\) 个人可和 第 \(i\) 个人坐同一辆车走。
    \(i+1\) 个人的等待时间 \(k = t_i+j-t_{i+1}\)
    状态转移方程式为:

\[f_{i+1, k} = \min(f_{i+1, k},f_{i,j}+k ) \]

  1. 否则,枚举第 \(i+1\) 个人的等待时间 \(k\)

    \[k\in [\max(0, t_i + j + m - t_{i+1}), 2m) \]

    状态转移方程式同上,为:

    \[f_{i+1,k} = \min (f_{i+1}, k, f_{i,j} + k) \]

复杂度 \(O(nm^2)\),期望得分 \(100\text{pts}\)

代码 P5017 摆渡车 - Luckyblock


P4910 【帕秋莉的手环】

题目要求:

给定一个长度为 \(n\) 的环,填入 金色或绿色。
不能有两个相邻的绿色。
多组数据, \(T\le 10, n\le 10^{18}\)

矩阵加速模板。

\(f_{i,0/1}\) 为当前填到第 \(i\) 位,第一个位置为 金色/绿色 的合法方案数。
分成第一个位置为 绿/金讨论:

  1. 第一个位置为绿色时,\(f_{1,0} = 0,f_{1,1} = 1\)
    由于不能有两个相邻的绿色,则结尾珠子必为金色。
    其对答案的贡献为 \(f_{n,0}\)
  2. 第一个位置为金色时,\(f_{1,0} = 1, f_{1,1} = 0\)
    此时结尾珠子颜色任意。
    其对答案的贡献为 \(f_{n,0} + f_{n,1}\)

状态转移方程:
\(f_{i,0} = f_{i-1,0} + f_{i-1,1}\)
\(f_{i,1} = f_{i-1,0}\)

复杂度 \(O(Tn)\),期望得分 \(\text{60pts}\)

上式显然可矩阵加速,转移矩阵如下:

\[\begin{bmatrix}f_{i-1,0}&f_{i-1,1}\end{bmatrix} \times \begin{bmatrix}1&1\\1&0\end{bmatrix} = \begin{bmatrix}f_{i,0}&f_{i,1}\end{bmatrix} \]

复杂度 \(O(T\log n)\),期望得分 \(\text{100pts}\)

代码 P4910 【帕秋莉的手环】 - Luckyblock


DP从入土到入门

标签:play   spl   状态   isp   不能   containe   复杂度   分类   other   

原文地址:https://www.cnblogs.com/luckyblock/p/13121167.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!