You are on page 1of 27

浅析信息学中的“分”与“合


福建省福州第三中学
杨沐
引言
分 合
“
分”的思 想是 “
合”的 思想与“
将一个 难以直接 分” 相对,是将 一
解决的 大问题, 些零 散的小问题 的
转化成 一些规模 解决 合并成一个 大
较小或 限制某些 问题 ,从而取得 整
条件的 子问题来 个问 题的解决。
思考, 以求将问
题解决 。
引言
 运用“分”与“ 合”思想方 法解题的精 髓
在于通过在“分 ”与“合”
 [ 例一 ] 牛奶模版 二分之间的转化 ,
找出解决问题的
N,K 限制下最优 化问题→关键,从而N,K,Len解决问题。
限制下存在 性
“分治法”是运
问题 用“分”与 “合”思想 方
 [ 例二 ] 树的重建 化归
法解题的重要应 用,此外, “分”与“ 合
规模为 n 的问题 →规模为
”的思想方法还 有更多、更 n-1 的问题
广泛的应用 。
 [ 例三 ] 最优序列
[ 例三 ] 最优 序列
 给定一 个长度为 N 的正整数序 列。
 求一个 子序列,使 得原序列中 任意长度 为
M 的子串 中被选出的 元素不超过 K 个。
 要求选 出的元素之 和最大。
 数据范 围:

1≤N≤1000
1≤K , M≤100
[ 例三 ] 最优 序列
 输入数 据:
N=10 , M=4 , K=2
{7 , 3 , 4 , 8 , 2 , 6 , 5 , 7 , 4 ,
8}
 输出答 案:
36

 {7 , 3, 4, 8, 2, 6, 5, 7, 4,
8}
[ 例三 ] 最优 序列 —— 分析
动态规划 超时
O(2M
N)
100
×1000)

线段树? 无从入手

怎么办? “ 分”
[ 例三 ] 最优序 列— —“ 分”繁
为简

 动态规 划之所以不 可行,原因 在于—— 题


目中 K 和 M 的范围太大 了!

 利用“ 分”的思想 ,我们尝试 限制 K ,令


K=1 ,也就 是对于长度 为 M 的子串,最多
只选一 个元素作为 原题的一个 子问题:
[ 例三 ] 最优 序列 —— 子问题
 给定一 个长度为 N 的正整数序 列。
 求一个 子序列,使 得原序列中 任意长度 为
M 的子串 中被选出的 元素不超过 1 个。
 要求选 出的元素之 和最大。
 数据范 围:

1≤N≤1000
1≤M≤100
[ 例三 ] 最优序 列— —“ 分”繁
为简
 对于这 个子问题, 由于 K 做了限制,我 们
可以用 动态规划来 解决这个问 题。

 设 dp[i] 表示前 i 个元 素, 在满足题 意的 前提 下选出 的最


大和
dp[i]=max(dp[i-1],dp[i-M]+value[i]) i≥M
dp[i]=max(dp[i-1],value[i]) 0<i<M
dp[0]=0
[ 例三 ] 最优序 列— —进 一步分

1 K

子问题 原问题

是否可以通过求解 K 次的子问题
从而解决原题呢 ?
[ 例三 ] 最优序 列— —进 一步分

 命题
原问题 的解 集等价 于由 K 组互不 相交的 子问 题
的解组 成的 解集。
 引理一

原问题 的任 意一组 解都 可以由 K 组不相 交的子


问题的 解组 成。
 引理二

任意 K 组不相交 的子 问题的 解的 并均为 原问 题


的解。
 引理一

原问题 的任意一组 解都可以由 K 组不相 交


的子问 题的解组成 。
 证明

对于原 问题的任意 一解 P={a1,a2,a3…at} ,


a1<a2<a3…<at 。设 sum[i] 表示该解在 区间
[1,i] 内取出的元素 个数,则 根据题意满足
不等式 :
sum[i]-sum[i-M]≤K
以下, 我们给出一 种构造法使 之能产生 一
组与该 解等价的 K 个子问题的 解。

设 K 个子问题的 解分别为 P0,P1,P2…Pk-1 ,


令 Pi={aj | j≡i (mod K)}
∵sum[i]-sum[i-M]≤K
∴ai-ai-k≥M
∴P0,P1,P2…Pk-1 均为合法的 子问题的解
又因为 P0∪P1∪P2…∪Pk-1=P ,因此我们 成
功地构 造出了子问 题的解。
 引理二

任意 K 组不相交的 子问题的解 的并均为 原


问题的 解。
 证明

设 K 个子问题的 不相交的解 分别为


P0,P1,P2…Pk-1 ,
Pi={ai1,ai2,ai3…ail} , ai1<ai2<ai3…<ail
∵ 对于任意 长度为 M 的区间, Pi 至多只
有一个 元素在其内 部
设 P=P0∪P1∪P2…∪Pk-1 ,
则对于 任意长度为 M 的区间, P 在其 内
部选出 的元素个数 不超过 K 个
∴ 任意 K 组互不相交 的子问题的 解的并
都是原 问题的合法 解。

引理一 与引理二分 别证明了命 题的充分 性


和必要 性,因此该 命题成立
[ 例三 ] 最优序 列— —进 一步分

 题目中
存在着一个 潜条件,即 :
每个 元素只能被 选一次

 若直接套用 K 次动态规划来求 解,有可 能


导致某 个元素被取 多次,无法 满足题目 中
的这个 条件。
[ 例三 ] 最优序 列— —进 一步分

 N=10 , M=4 , K=2
{1 3 1 1 1 1 1 1 3 1}
3 3
3 3
并 1 3 1 1 3
1 动态 规划: 12
 贪心 : 9 标准答 案: 10
[ 例三 ] 最优序 列— —整 体分析
 考虑动态规划与贪 心之所以不 能得到正 确
解,其 关键原因在 于——题目 中存在着 一
个元素 只能被取一 次的限制, 而对于这 种
限制各 点被选取次 数的题目, 我们通常 使
用网络 流来解决, 那么这道题 是否也能 通
过转化 图论模型来 使用网络流 解决呢? 答
案是肯 定的。
[ 例三 ] 最优序 列— —整 体分析
 构造带 权网 络 G=(V,A,C)
 序列中 的每 个元素 i 用顶 点 i 与 i’ 表示, i→i’ 连
边,容 量为 1 ,费 用为该 元素 的数值 value[i] ,
图中包 含源 S 与汇 T 。
 所有点 i 向点 (i+1) 连边 ,容量 为 +∞ ,费 用为 0
 源 S 向所有 点 i 各连一 条边, 容量 为 +∞ ,费用
为0
 所有点 i’ 向汇 T 各连一 条边, 容量 为 +∞ ,费用
为0
 所有点 i’ 向点 (i+M) 连边, 容量为 +∞ ,费 用为
S
容量 = +∞
1
费用 = 0
value[i]

……
1 2 3 n

1’ 2’ 3’
……
n’

T
[ 例三 ] 最优序 列— —整 体分析
 构图完成之后,网 络中的每个 单位流量 表
示一个 子问题的解 ,因此,我 们只需要 在
网络中 寻找 K 次最大费用增广 路即可得 到
答案。

 由于这 张图的边数 与顶点数同 阶,若使 用


SPFA 算法求增广轨, 则期望时间 复杂度
仅为 O(KN) ,是个 十分优秀的 算法。
总结
转化 辨证关

对立

分 合
“ 分”的 思想帮助我 们迅速地切入 问题
核心, 但若过分细 化则会使问 题太过凌 乱
,失去 求解的方向 统一
;而“合” 的思想则 以
线串珠 ,使各种纷 杂无序的问
善于题具有了 整
归纳总结
分中有合,合中
体性。
有 勇于创新

谢 谢
 总结:“分”与“合”虽然对立,却没有明显的分
界。一道问题若使用“分”的方法,则必然有“合
”的操作,正所谓“分中有合,合中有分”,这两
者相互对立,各有优势,却又相互补充,“分”的
思想帮助我们迅速地切入问题核心,但若过分细化
则会使问题太过凌乱,失去求解的方向;而“合”
的思想则以线串珠,使各种纷杂无序的问题具有了
整体性,这正体现了两者之间的辨证关系。
 运用“分”与“合”的思想,对于不同的题目需要
不同的分析,其精髓就在于“转化”。无论是“分
”还是“合”都是朝着将问题转化为更加便于思考
的方向前进,而在这路途中,又需要我们善于归纳
总结。只有将已有的知识与“分合”思想有机地结
合起来,同时勇于创新,不断积累经验,我们才能
从千变万化的题目中找寻出本质,从而更快更有效
地解决实际问题。
小结
转化目

网 整体 部分
络 动态规
流 划
! 贪心
线段树 无法 解决该 题的原 因
 因为原 问题是要求 对于任意长 度为 M 的
区间, 都限制了取 数不超过 K 个。而这 些
区间有 互相有交, 这使得线段 树很难准 确
的表示 一个状态并 进行处理。
 更重要 的是,线段 树只是一个 用来提升 算
法效率 的辅助工具 ,若要使用 线段树, 则
必须先 提出一个可 行的算法。 但对于这 题
我们很 难想出一个 可以使用线 段树的算 法

动态规 划的 解法
 将连续 M 位的 被选状 态 (0,1) 压缩 成 M 位二 进
制数表 示 ,DP[i,j] 表示 [1,i] 区间 , 最后 M 位状 态
为 j 时的最 优解 , 由于 满足无 后效 性和最 优子 结
构性质 , 可以 使用动 态规 划解决 , 转移方 程如下
: m −1
dp[i, j ] = max(dp[i − 1,2 + j / 2], dp[i − 1, j / 2]) + ( jand1)value[i]

You might also like