0%

【习题解答】 动态规划算法设计要素

13.1

大概思路是 + 代价初始化 + 从左到右,从下到上以代价计算

具体请根据160页、161页两个数组的定义将思路写成算法形式。

13.2

  • 表示前i个自然数构成的集合是否存在元素和是j
  • 状态初始化
    • ,若
    • ,若
  • 状态转移方程
    • ,若
    • ,若
  • 时间复杂度

13.4

  • d[i]表示以第i个数结尾的最长非减序列的长度
  • d[1]=1
  • 状态转移方程
  • 复杂度

13.5

  • 设问题表示前个数字划分为份的最低代价
  • 目标问题是解决
  • 线性代价先求出的前项和
  • 初始状态
  • 状态转移方程为是
  • 表示的是在第个切最后一刀划分的情况。
  • 时间复杂度为,空间复杂度为

下面再给出一些改进的思路 + 是关于的增函数 + 是关于的减函数 + 本质是二分法找俩函数的交点,即比较的大小 * 若小于,则左半边递归查找 * 若大于,则右半边递归查找 + 改进后时间复杂度 + 观察状态转移方程,事实上空间复杂度可以降为

13.8

(1)

  • 表示x中前i个构成的串,和y中前j个构成的串的最长公共子序列
    • ,若
    • ,若
    • ,若

(2)

  • 表示x中前i个构成的串,和y中前j个构成的串的最长公共子序列
    • ,若
    • ,若
    • ,若

(3)

  • 表示x中前i个构成的串,和y中前j个构成的串的最长公共子序列
  • 表示最长公共子序列对应的将来还能使用的次数。
    • ,若
    • ,若
    • ,若
    • ,若
    • ,若
    • ,若
    • ,若

13.9

  • 表示以结尾和以开头的两个最长连续子串,且
    • ,若
    • ,若
  • 计算的代价是,同时结果还需开销来遍历取最大值
  • 总的复杂度是平方级别

13.10

  • 表示的最短公共超序列
    • ,若
    • ,若
    • ,若
    • ,若
    • ,若

13.11

(1)

不对,例如,正确答案是可以合并,但算法中Z'=(ABAC)不等于Y

(2)

  • 中前i个数和中前j个数能否合成为中前i+j个数
  • 复杂度

(3)

  • 中前i个数和中前j个数合成为中前k个数需要删除的元素集合。
  • 是下面几种可能的情况中最小的集合
    • ,若
    • ,若
  • 复杂度

13.12

(1)

  • 表示前i个字符的子串是否合法
  • 复杂度

(2)

第一问的取的是布尔二值变量,事实上可以改进为整型。 + 状态转移方程修改为:f(i)=j if f(j)>0 and dict(S[j+1...i])==True + 设函数getSeq(k)表示求合法序列s[1...k]的单词序列 + 则getSeq(n)=getSeq(f(n)) + S[ f(n)+1...n ]

13.13

(1)

  • 表示原串
  • 表示以第个字符结尾的长度为的子串对应的最长回文子序列长度
  • ,则
  • ,则
  • 这里为什么要这样假设?如果认为表示子串的最长回文子序列长度,有什么不好的地方?

(2)

  • 本题和13.12的第一问几乎一个思路。
  • 首先对于给定的一个子串str[i...j],需要判断是不是回文串check[p,q],其中p=j,q=j-i+1,表示以第p个字符结尾的长度为q的子串是否为回文串。
  • check的功能对应到13.12的dict()函数
  • 回文串的判断本身可以用dp来做,的复杂度。
    • ,则
    • ,则
    • 否则
  • 表示以第i个字符结尾的子串最少拆分回文数

13.15

本题只考虑的情况,否则把大面值的硬币剔除出去。 ### (1) + 表示用面值的硬币能否兑换j + + 复杂度O(nv)

(2)

  • 表示用面值的硬币能否兑换j
  • 复杂度O(nv)

(3)

  • 表示用面值的硬币能否兑换j,且要求使用不超过t个硬币
  • 复杂度O(nvk)

13.16

  • 表示第i个节点所在子树的最小点覆盖数,且要求节点i在点覆盖集中
  • 表示第i个节点所在子树的最小点覆盖数,且要求节点i不在点覆盖集中
  • 则状态转移方程
  • 转移顺序是从叶子节点向根节点转移
  • 复杂度是线性,因为每个节点在做一次根节点和做一次子节点时访问到,O(2n)

13.18

  • 假设表示到达第i个旅店的最小惩罚
  • 通过的代价获得到每个旅店的最小惩罚
  • 在更新的状态转移矩阵的时候可以记录每个旅店最小惩罚对应的前一个旅店位置

13.23

  • 本题是树的dp,思路和13.16几乎一样,设友好度评价为
  • 表示第i个节点所在子树的最大评价,且要求节点i在名单中
  • 表示第i个节点所在子树的最大评价,且要求节点i不在名单中
  • 则状态转移方程
  • 转移顺序是从叶子节点向根节点转移
  • 复杂度是线性,因为每个节点在做一次根节点和做一次子节点时访问到,O(2n)

13.24

  • 换个角度思考,题目等价于把比萨店进行划分,使得两条路线的和最小(想象是两个骑手)。
  • 假设是对前i个店进行划分后的最短路程,i>j,并且第一个骑手以i店结尾,第二个骑手以j店结尾。
  • 显然第j+1到第i个店都是属于第一个骑手的。
  • 初始情况,
  • 假设已知,则状态转移方程如下
  • 上述状态转移方程本质上讨论的是比萨店分配给哪个骑手。
  • 复杂度