algorithm - map 和动态规划更新

标签 algorithm map go

给我的问题是

一个 child 正跑上 n 级楼梯, 一次可以跳 1 步、2 步或 3 步。 实现一种方法来计算 child 可以通过多少种可能的方式跑上楼梯。

http://play.golang.org/p/bpjIkMm9jH

package main

import "fmt"

func CountWaysDP(n int, mm map[int]int) int {
  if n < 0 {
    return 0
  } else if n == 0 {
    return 1
  } else if mm[n] > -1 {
    return mm[n]
  } else {
    mm[n] = CountWaysDP(n-1, mm) +
      CountWaysDP(n-2, mm) +
      CountWaysDP(n-3, mm)
    return mm[n]
  }
}

func main() {
  mm := make(map[int]int)
  fmt.Println(CountWaysDP(10, mm), mm)
}

这只给了我 0 个 map[]。事实证明,动态递归在以下行结束:

else if mm[n] > -1

那我怎么用动态规划来解决这个问题呢?这与 Cracking the coding interview 中的解决方案完全相同......

最佳答案

你需要和0比较:

else if mm[n] > 0

当为不存在的键获取值时,map 返回 0。

您也可以使用数组/slice 代替映射,因为您知道映射键总是从 1 到 N

你也可以不用递归来解决这个问题:

package main

import "fmt"

func main() {
    n := 10
    mm := make([]int, n+1)
    mm[0] = 1
    for i := 1; i <= n; i++ {
        for k := 1; k <= 3; k++ {
            if i-k >= 0 {
                mm[i] += mm[i-k]
            }
        }
    }
    fmt.Println(mm)
    fmt.Println(mm[n])
}

关于algorithm - map 和动态规划更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22758328/

相关文章:

c# - 算法:基于相同序列的数字替换

algorithm - 通过他们的工作速度管理我的成员

java - 将 LinkedHashMap 中的所有键提取到列表中的方法

json - 在不使用临时结构的情况下实现 Unmarshaller

go - 如果键总是唯一的,同时写入 Golang 映射是否安全?

algorithm - 如何使用Google OR工具解决流游戏?

r - 如何使用ggplot2使用带有描述相关标签的图例添加区域 map 的图例?

c++ - 计算 map 中相同值的数量

go - 通过 API GW 调用时,AWS Lambda Go 函数未获取请求正文

算法时间分析 : Recursion Case Puzzle