Skip to content

Lec 18 动态规划IV:切割问题

[TOC]

Wraps in a <div class="vp-raw">

Outline

  • 整数子问题
  • 伪多项式时间
  • 例子
    • 切割杆问题
    • 子集求和问题
  • DP特性复习

切割杆问题

  • 给定一个长度为L的杆,和不同长度l的杆的价值v(l), l{1,2,...L}

  • 目标:切割杆最大化切割杆价值

  • Ex: L = 7, v = [0, 1, 10, 13, 18, 20, 31,32]

  • 贪心算法能获得最大价值吗?

    • 不一定!

SRTBOT分析:

  1. 子问题: x(l): 切割长度l的杆能获得的最大价值,对于l{0,1,..L}成立

  2. 递归关联子问题解:

    • 第一块为长度p(猜的!)
    • x(l)=max{v(p)+x(lp)|p{1...,l}}
  3. 拓扑顺序

    • l增长: 子问题x(l)仅仅取决于严格递减的l,所以不会成环。for l​​ = 0, 1..., L

    • 子问题的DAG

  4. 基本情况

    • x(0) = 0
  5. 原始问题:

    • 长度为L的切割杆的最大价值是x(L)
  6. 时间分析

    • 子问题数量: L+1
    • 每个子问题的工作量: O(l) = O(L)
    • O(L2) 运行时间

Θ(L2)这是一个多项式时间吗?

  • (强)多项式时间是指,运行时间被输入大小的常数次数多项式所界定,而输入大小以word(字数)计算(这里例子中,因此这些数字都可以在机器字中存储)
  • 在杆切割问题中,输入大小是 L + 1 字(一个整数 L 和 在价值函数 v 的 L 个整数 )
  • O(L²) 是 L + 1 的常数次数多项式,因此答案是:是的,(强)多项式时间

子集求和

  • 输入: n个正整数序列A={a0,a1,...,an1}
  • 输出: 是否在存在A的子集,使其求和恰好等于T?即是否存在A的子集A',使得aAa=T
  • Ex: A = (1, 3, 4, 12, 19, 21, 22), T = 47, 可以找到子集 A' = {3, 4, 19, 21}
  • 这是个优化问题?
    • 不是,这是一个决策问题。答案是YES or NO, Ture or False,而不是求最大值最小值这类优化问题。

SRTBOT分析

  1. 子问题:

    • x(i,t) = A[i:]的子集求和为t
    • i{0,1,...n}, t{0,1,...T}
  2. 递归关联子问题解:

    • 思路:第一项ai 是否在A合法子集S内(Guess!)
    • 如果是,用剩余项尝试求和成tai
    • 如果不是,用剩余项尝试求和成t
    • x(i,t)={x(i+1,tai) if aitaiSx(i+1,t)aiS
  3. 拓扑顺序

    • 子问题x(i, t)仅仅依赖更大索引的子问题x(i+1, t)或者x(i+1, t-A[i])
    • 解决问题可以按照i严格递减的顺序(即从大到小)
  4. 基本情况

    • x(n,t)={Yes if t = 0No if t0
  5. 原始问题

    • x(0, T)

    • 解决所有子问题的DGA

      • 至底向上

      • 至顶向下

  6. 时间分析

    • 子问题数目O(nT), 每个子问题工作量为O(1),因此需要O(nT)时间

这是多项式时间吗?

  • 输入大小n+1:整数T和A里面的n个整数
  • O(nT)被n+1的多项式界定吗?
    • n和T的关系未知,T可能是n,n^2
    • 在w-bit的Word-RAM 模型, 已知T2wwlogn,但是可能w >> log n,我们并不知道w的上界
      • e.g. w=n 也是不合理的,运行时间就成了O(n2n), 这是指数级的

伪多项式

  • 算法的伪多项式时间:运行时间上界由输入大小和输入整数的常次数多项式界定
  • 如果整数在输入大小上是多项式有界的,即nO(1)(与基数排序在 O(n)​ 时间内运行的情况相同),那么这种算法在这种情况下是多项式的
  • 计数排序O(n+u),基数排序O(nlognu),直接访问数组构建O(n+u),斐波那契O(n)都是伪多项式算法
  • 计数排序是弱多项式(基于强多项式和伪多项式之间的概念): 在以位数测量的输入大小(即输入整数的对数)上界由常数次多项式界定
  • 与切割杆问题相比,它是多项式的
    • 对L有伪多项式以来
    • 但幸运的是也有L个输入整数
    • 如果仅给出可销售杆长度的子集(背包问题,它推广了杆切割和子集和问题——见课堂讨论),那么算法将仅是伪多项式的

复杂度

  • 当整数不是多项式有界时,子集和问题可以在多项式时间内解决吗?
  • 如果 P ≠ NP,则不行。那是什么意思?下节课再讲!

总结动态规划特性

  • 如何定义子问题

    • 前缀、后缀问题:最大公共子序列,最大递增子序列

    • 子串问题: 交替硬币游戏,括号问题

    • 整数子问题:切割杆问题,子集和问题,斐波那契数列;

    • 多字符串问题:最大公共子序列

    • 顶点问题: SPS

    • 子问题约束/扩展

      • 非可扩展的限制: 最大递增子序列
      • 2x:交替硬币游戏,括号问题
      • θ(1)x: 钢琴指法问题
      • θ(x)x: Bellman-Ford
  • 递归关联子问题(如果子问题定义是正确的,那么你可以写出一个递归关系)

    • θ(1) 分支: 斐波那契数列, 保龄球得分问题, LCS,ACG,Floy-wareshall
    • θ(degree) 分支: DAG, Bellman-ford
    • θ(n) branching: LIS, 括号问题, Rob Cutting
    • combine multiple sulution(not path in DAG): Fib, FW,括号
  • Original: combine multiple subprobs: DAG, LIS, B-F, F-W