地图和动态规划更新

Posted

技术标签:

【中文标题】地图和动态规划更新【英文标题】:Map and Dynamic Programming Updating 【发布时间】:2014-03-31 09:41:41 【问题描述】:

我遇到的问题是

一个孩子正在跑上 n 个台阶的楼梯, 并且一次可以跳 1 步、2 步或 3 步。 实现一个方法来计算孩子可以用多少种可能的方式跑上楼梯。

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 个地图 []。原来动态递归在下面一行结束:

else if mm[n] > -1

那么我将如何使用动态规划来解决这个问题呢?这与破解编码面试中的解决方案完全相同......

【问题讨论】:

【参考方案1】:

你需要和0比较:

else if mm[n] > 0

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

您也可以使用数组/切片而不是映射,因为您知道映射键总是从 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])

【讨论】:

【参考方案2】:

分而治之的 Python 解决方案:

def staircase_count(nSteps):
    if nSteps < 0:
        return 0
    if nSteps == 0:
        return 1
    total = 0
    for step in [1, 2, 3]:
        total += staircase_count(nSteps - step)
    return total

assert staircase_count(1) == 1
assert staircase_count(2) == 2
assert staircase_count(3) == 4
assert staircase_count(4) == 7

【讨论】:

【参考方案3】:

javascript 解决方案:(迭代)

   function countPossibleWaysIterative(n) 
      if (n < 0)
        return -1; // check for negative, also might want to check if n is an integer
       if (n === 0) 
        return 0; // for case with 0 stairs
       else if (n === 1) 
        return 1; // for case with 1 stairs
       else if (n === 2) 
        return 2; // for case with 2 stairs
       else 

        var prev_prev = 1;
        var prev = 2;
        var res = 4; // for case with 3 stairs

        while (n > 3)  // all other cases
          var tmp = prev_prev + prev + res;
          prev_prev = prev;
          prev = res;
          res = tmp;
          n--;
        
      
      return res;
    

【讨论】:

以上是关于地图和动态规划更新的主要内容,如果未能解决你的问题,请参考以下文章

路径规划基于D星算法实现栅格地图机器人路径规划

路径规划基于D星算法实现栅格地图机器人路径规划

动态规划-状压DP(炮兵阵地)

有限状态机和动态规划

动态规划 < 第 3 天 >

动态规划 < 第 3 天 >