DP从入土到入门

Posted luckyblock

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DP从入土到入门相关的知识,希望对你有一定的参考价值。

做一大堆DP


P5017 摆渡车

详见 P5017 摆渡车 - Luckyblock

算法一

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

[f_i = min_{jle 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=sumlimits_{t_kle i} 1, pos_i = sumlimits_{t_kle i}{t_k} ]

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

[sumlimits_{j < t_k le i}{i-t_k} = (cnt_i-cnt_j) imes i - (pos_i-pos_j)]

替换状态转移方程。

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

[f_i = min_{jle i-m}(f_j + (cnt_i-cnt_j) imes i - (pos_i-pos_j)) ]

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

故转移方程可替换为:

[f_i = min_{i-2mle jle i-m}(f_j + (cnt_i-cnt_j) imes i - (pos_i-pos_j)) ]

减去无用状态。

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

则可将状态转移方程改为:
(f_i = egin{cases}f_{i-m} &cnt_i=cnt_{i-m}\\ min_{i-2mle jle i-m}(f_j + (cnt_i-cnt_j) imes i - (pos_i-pos_j))& ext{otherwise}end{cases})

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

复杂度 (O(nm^2 + t)),期望得分 (100 ext{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)

    [kin [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 ext{pts})

代码 P5017 摆渡车 - Luckyblock


P4910 【帕秋莉的手环】

题目要求:

给定一个长度为 (n) 的环,填入 金色或绿色。
不能有两个相邻的绿色。
多组数据, (Tle 10, nle 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)),期望得分 ( ext{60pts})

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

[egin{bmatrix}f_{i-1,0}&f_{i-1,1}end{bmatrix} imes egin{bmatrix}1&1\\1&0end{bmatrix} = egin{bmatrix}f_{i,0}&f_{i,1}end{bmatrix} ]

复杂度 (O(Tlog n)),期望得分 ( ext{100pts})

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

















以上是关于DP从入土到入门的主要内容,如果未能解决你的问题,请参考以下文章

Excel从入门到入土

C++从入门到入土第四篇:运算符重载

Java从入门到入土

Activiti工作流从入门到入土:入门实例

《Java从入门到精通(入土)》字符串 下

C++从入门到入土第二篇:C++入门(续)