从自上而下到自下而上的算法(DP)

时间:2014-05-14 15:25:34

标签: ruby algorithm dynamic-programming

我已经创建了这个算法来计算最长的回文子序列(镜子时相同的词,即“aba”,“racecar”),并且使用递归的自上而下方法完成。我知道可以将这些转化为自下而上的迭代算法,但我很难看到如何实现这一点

我的代码

def palindrome(string, r = {})
    return 1 if string.length == 1
    return 2 if string[0] == string[1] and string.length == 2
    return r[string] if r.include?(string)
    n = string.length
    if string[0] == string[n-1]     
        r[string] = palindrome(string[1..n-2],r) + 2
    else
        r[string] = [palindrome(string[0..n-2],r), palindrome(string[1..n-1],r)].max
    end
end

1 个答案:

答案 0 :(得分:0)

  1. 在从数组中提取项目时使用负数时,数组会从末尾开始计算元素,因此您不必保留{{1}变量

    n
  2. 我不知道这是多么高效,但这是一个自上而下的建议:

    if string[0] == string[-1] # <= same as string[n-1]
      r[string] = palindrome(string[1..-2],r) + 2 # <= same as string[1..n-2]