动态规划练习-切棍子与最长子序列

2020-06-07  本文已影响0人  小跑001

1. 切棍子

题目:

给出棍子的价格 p(i), 其中i代表棍子的长度. 考虑一个长度为n的棍子, 如何切割才能达到总价值最大. 并且每次切割都会花费固定的费用c. 要求用动态规划的方法.

答:

MODIFIED-CUT-ROD(p, n, c) // p是数组, 代表不同长度的不同价格. 
    let r[0..n] be a new array // 用来分别存储0-n长度的最大价值
    r[0] = 0  // 长度为0, 价值自然也是0
    for j = 1 to n // 自底向上分别求出各个长度的最大价值
        q = p[j] // 不切割情况下的价值
        for i = 1 to j - 1 // 遍历从各个位置切割的情况
            q = max(q, p[i] + r[j - i] - c) // 算出指定位置切割下的价值, 并且和最大值比较, 如果大, 就替换为最大价值
        r[j] = q
    return r[n]

2. 最长子序列

题目1:

求序列⟨1,0,0,1,0,1,0,1⟩ 和 ⟨0,1,0,1,1,0,1,1,0⟩最长子序列

答:

题目2:

给定一个字符串, 求出最长子序列, 要求子序列单调递增, 并且算法时间复杂度为O(n^2)

答:

PRINT-LCS(c, X, Y)
    n = c[X.length, Y.length]
    let s[1..n] be a new array
    i = X.length
    j = Y.length
    while i > 0 and j > 0
        if x[i] == y[j]
            s[n] = x[i]
            n = n - 1
            i = i - 1
            j = j - 1
        else if c[i - 1, j] ≥ c[i, j - 1]
            i = i - 1
        else j = j - 1
    for i = 1 to s.length
        print s[i]
MEMO-LCS-LENGTH-AUX(X, Y, c, b)
    m = |X|
    n = |Y|
    if c[m, n] != 0 or m == 0 or n == 0
        return
    if x[m] == y[n]
        b[m, n] = ↖
        c[m, n] = MEMO-LCS-LENGTH-AUX(X[1..m - 1], Y[1..n - 1], c, b) + 1
    else if MEMO-LCS-LENGTH-AUX(X[1..m - 1], Y, c, b) ≥ MEMO-LCS-LENGTH-AUX(X, Y[1..n - 1], c, b)
        b[m, n] = ↑
        c[m, n] = MEMO-LCS-LENGTH-AUX(X[1..m - 1], Y, c, b)
    else
        b[m, n] = ←
        c[m, n] = MEMO-LCS-LENGTH-AUX(X, Y[1..n - 1], c, b)
上一篇 下一篇

猜你喜欢

热点阅读