动态规划及其应用(一)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Porcelain

取物品?

分组背包问题 每个架子是一个“物品”,在0..100的不同“重量”下有不同的 “价值” 如何求每个架子的“价值”? DP? 枚举! O(n * 100^2 + n * m * 100) n * m * 100 = 10^8,为什么可以

从最左端和最右端取?


容量从大到小DP
完全背包

每种物品个数无限多 每种物品有选0件,选1件,选2件…选V/c[i]件等选择 for i 1..n for v c[i]..V f[v]=max{f[v],f[v-c[i]]+w[i]}
完全背包

每种物品个数无限多 每种物品有选0件,选1件,选2件…选V/c[i]件等选择 for i 1..n for v c[i]..V f[v]=max{f[v],f[v-c[i]]+w[i]}

给定一n*m网格,格点有正整数权值,求从左上角到 右下角的最优路径 最优路径为权值总和最大的路径 只允许向下或向右走 某些格子不允许经过
路径个数

状态

最优子问题性质 f[i][j]表示从左上角到(i, j)的最优路径的值 f[i][j] = max{ f[i-1][j] , f[i][j-1] } + a[i][j] O(nm)

转移方程


时间复杂度

路径个数

给定一n*m网格,格点有正整数权值,求从左上角到 右下角的最优路径 最优路径为权值总和对p取模最大的路径 只允许向下或向右走 某些格子不允许经过 状态设计


最优子问题性质 仍使用f[i][j]可以吗?
路径个数

状态

最优子问题性质 f[i][j][k]表示是否存在一条从左上角到(i, j)的路径,路径 和对p取模为k 略 O(nmp)


记忆化搜索

Porcelain

给定n个架子,每个架子上从左至右排有不超过100个 物品,每个物品有自己的价值。 从某个架子取物品时,只能取走最左端或最右端的物 品。 取m个物品,使价值总和最大。 1<= n <= 100, 1 <= m <= 10000 CodeForces 148 E

第一遍由下至上求down[] 第二遍由上至下利用down[]求up[]

Biblioteka Baidu时间复杂度 O(N * 20)
Bag of mice

龙和公主博弈,公主先手。 包里有w只白老鼠和b只黑老鼠,双方轮流从包里随机 抽出一只老鼠,谁先抽出白老鼠谁为胜者。 特殊地,龙抽出老鼠后,包里随机一只老鼠会因恐 惧,自己跳出背包。 没人抽出白老鼠时,龙为胜者。 求公主获胜的概率。 0 <= w, b <= 1000 CodeForces 148 D
多重背包

第i种物品有选0件,选1件,选2件…选k[i]件等选择 将第i种物品拆成k[i]个普通物品,转化为0/1背包

复杂度:O(V*Σ物品个数)

将第i种物品拆分成1,2,4,...,2^(x-1),k[i]-2^x+1个物品, 其中x是满足k[i]-2^x+1>0的最大整数

如此拆分,可以拼凑出0..k[i]个物品 复杂度:O(V*Σlog物品个数) mod 复杂度:O(V*N)

转移方程


时间复杂度


直接计算C(n+m, n) 时间复杂度

O( (n+m) * 运算) 运算 = 高精度 / 模运算求逆元
路径个数

给定一n*m网格,求从左上角到右下角的路径总数 只允许向下或向右走 某些格子不允许经过
路径个数

动态规划

f[i][j]表示从左上角到(i, j)的方案数 if (pass[i][j]) f[i][j] = f[i-1][j] + f[i][j-1]; else f[i][j] = 0; O(nm)
记忆化搜索 区间动态规划 树形动态规划

Trie AC自动机* 环+外向树* SAM*

背包问题 状态压缩动态规划

基于连通性的状态压缩动态规划*

数位统计
动态规划常用优化

加速转移

单调队列 线段树/树状数组/平衡树* 斜率优化* 四边形不等式(决策单调性) 矩阵乘法* 前缀和
Nearby Cows

“FJ有N个草地(1<=N<=100000),有N-1条双向道路连 接这些草地,FJ精心设计了这些道路使每两个草地有 且仅有一条简单路径连接。”

题目精心地告诉你一个字:树

对树中每个点x,求到点x的距离不超过20的点的权值 和

down[i,0..20] 表示 深度-点i深度<=0..20 的点的权值和 up[i,0..20] 表示 点i深度-深度<=0..20 的点的权值和 2遍树形DP解决
范围


数字三角形




给定一个由n行数字组成的数字三角形如下图所示。试设 计一个算法,计算出从三角形的顶至底的一条路径,使该 路径经过的数字总和最大。 输入数据的第1 行是数字三角形的行数n,1<=n<=100。 接下来n行是数字三角形各行中的数字。所有数字在0..99 之间。 5 7 38 810 2744 45265 IOI 1994

转移方程


时间复杂度

路径个数

状态

f[i][j]
阶段
路径个数

给定一n*m网格,求从左上角到右下角的路径总数 只允许向下或向右走 某些格子不允许经过 至多改变p次方向 无后效性


如何设计状态 怎样的状态能完整记录需要的信息
路径个数

状态

f[i][j][k][2]表示从左上角到(i, j)已改变了k次方向且最后一 步的方向为0或1的方案数 根据状态列写 O(nmp)

时间复杂度


Martain Strings

给定一长度为n的大写字母串S,以及m个长度不超过 1000的大写字母串s[1]..s[m]。求s[i]是否满足:

存在a, b, c, d, 满足1 <= a <= b < c <= d <=n s[i] 是 ( S[a..b] + S[c..d] ) 的子串

转移方程


时间复杂度

路径个数

给定一n*m网格,求从左上角到右下角的路径总数 只允许向下或向右走 某些格子不允许经过 练练看

改变方向次数在[L, R]内 不允许连续改变方向 t步之内必须转向 对于任一格点(x,y),(x,y)和(x+1,y+3)不能都 在路径上
路径个数

转移方程


时间复杂度

路径个数

给定一n*m网格,格点有正整数权值,求从左上角到 右下角的最优路径 只允许向下或向右走 某些格子不允许经过 练练看

最优路径为平均数最小的路径 最优路径为权值最大值与最小值之差最小的路径 最优路径为路径上相邻格点的差的最大值最小的路径 最优路径为路径上任意5个相邻的格点的和的最大值最小的 路径

状态

决策(转移) 边界


策略

动态规划

Dynamic Programming

求解决策过程最优化的数学方法 最优化原理(最优子结构性质) 无后效性 子问题的重叠性 因同样有状态、转移方程、无后效性等性质,故将递推等 类型也纳入DP之下 如计算方案数、期望值

适用条件



决策(转移方程)


策略

路径个数

给定一n*m网格,求从左上角到右下角的路径总数 只允许向下或向右走
路径个数

动态规划

f[i][j]表示从左上角到(i, j)的方案数 f[i][j] = f[i-1][j] + f[i][j-1] 边界:f[i][0] = 0; f[0][j] = 0; O(nm)

时间复杂度

O(n^2)
数字三角形


7 38 810 2744 45265 状态

i=1 i=2 i=3 i=4 i=5
阶段
f[i][j] f[i][j] = max { f[i-1][j-1], f[i-1][j]} + a[i][j]; FOR(i, 1, n) FOR(j, 1, i) 转移方程

双端单调队列优化多重背包

分组背包

这些物品被划分为若干组,每组中的物品互相冲突, 最多选一件。 for 所有的组k for v V..0 for i属于组k f[v]=max{f[v],f[v-c[i]]+w[i]} 时间复杂度

O(VN)
动态规划常见题目模式


枚举分界点


求L,R


时间复杂度

子序列

给定一个长度为N(N为偶数)的整数int序列,问能否 将其划分为两个长度为N/2的严格递增子序列。 每个数字属于且仅属于一个子序列 最多50组数据 N <= 2000
子序列

状态

无后效性 前i个数,只需记录什么? 布尔数组 F[i][j]表示 将前i个数分成2个递增子序列是否可 行,其中第j个数是其中一个递增子序列的末尾(另一个递 增子序列的末尾必然是第i个数) 考虑第i+1个数接入哪一个子序列 枚举每个j,若f[i][j]为真,考虑从f[i][j]转移,分两种情况 O(n^2)

“+”表示字符串的连接

2 <= n <= 10^5, 1 <= m <= 100 CodeForces 149 E
Martain Strings

分析条件:s[i]是否满足:

存在a, b, c, d, 满足1 <= a <= b < c <= d <=n s[i] 是 ( S[a..b] + S[c..d] ) 的子串 设分界点为x 设s[i]在S[1..x]中的最长前缀长度为L 设s[i]在S[x+1..n]中的最长后缀长度为R 若L + R >= length(s[i]),则s[i]满足条件 kmp hash + 二分 O(nm)
动态规划及其应用(一)
清华大学 杨志灿
动态规划术语

阶段

把所求解问题的过程恰当地分成若干个相互联系的阶段,以便于 求解 状态表示每个阶段开始面临的自然状况或客观条件 一个阶段的状态给定以后,从该状态演变到下一阶段某个状态的 一种选择(行动)称为决策。 转移过程中的初始情况 由每个阶段的决策组成的序列称为策略。对于每一个实际的多阶 段决策过程,可选取的策略有一定的范围限制,这个范围称为允 许策略集合。允许策略集合中达到最优效果的策略称为最优策略。
数字三角形

用a[i][j]表示第i行第j个数字的大小 转移方程

用f[i][j]表示从(1,1)到(i,j)的最优路径的数字和 f[i][j] = max { f[i-1][j-1], f[i-1][j]} + a[i][j]; “顺推”式更新

f[i][j] + a[i+1][j] f[i+1][j] f[i][j] + a[i+1][j+1] f[i+1][j+1]

状态设计/转移更新

Nearby Cows



FJ有N个草地(1<=N<=100000),有N-1条双向道路连 接这些草地,FJ精心设计了这些道路使每两个草地有 且仅有一条简单路径连接。 第i个草场有Ci头牛,有时候奶牛会走过最多K条道路 到其他草地吃草。FJ想知道每个草场最多可能有的奶 牛数量Mi,即所有走过K条道路后可能到达i的奶牛总 数。 1 <= K <= 20 Usaco 2012 Feb
Bag of mice

无后效性

记f[i][j]为包里有i只白老鼠,j只黑老鼠时,公主先手的胜率 当前状态仅与包里两种老鼠个数有关,与之前的抽取情况 无关 龙抽出老鼠后会有随机一只老鼠逃跑 计算f[i][j]需要一次模拟公主和龙的行动 一道比较适合使用记忆化搜索的题目 比较直观

特殊选手:龙
背包问题

给定若干种物品,每种物品都有自己的重量和价格, 在限定的总重量内,使得选取的物品的总价格最高。 NP完全问题
0/1背包


有N件物品和一个容量为V的背包。第i件物品的重量是 c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品 的重量总和不超过背包容量,且价值总和最大 每个物品只有选和不选2种选择 f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的 最大价值。 for i 1..n for v c[i]..V f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 压缩空间 for i 1..n for v V..c[i] f[v]=max{f[v],f[v-c[i]]+w[i]}
相关文档
最新文档