算法:动态规划

2017-12-14  本文已影响8人  Caolongs

题目:有一座高度是10阶的楼梯,从下往上走,没跨一步只能向上1级或者2级台阶。要求用程序求出一共有多少种走法。

F(1) = 1;
F(2) = 2;
F(n) = F(n-1)+F(n-2) (n>3)

解法一:递归求解

int getClimbingWays(int n) {
  if(n < 1){
    return 0;
  }
  if(n == 1){
    return 1;
  }
  if(n == 2){
    return 2;
  }
  return getClimbingWays(n-1)  + getClimbingWays(n-2);
}

解法二:备忘录算法

int getClimbingWays(int n, HashMap<Integer, Integer> map) {
  if(n < 1){
    return 0;
  }
  if(n == 1){
    return 1;
  }
  if(n == 2){
    return 2;
  }
  if(map.contains(n)){
    return map.get(n);
  }else{
    int value = getClimbingWays(n-1)  + getClimbingWays(n-2);
    map.put(n,value);
    return value;
  }
}
  

解法三:动态规划求解

int getClimbingWays(int n) {
  if(n < 1){
    return 0;
  }
  if(n == 1){
    return 1;
  }
  if(n == 2){
    return 2;
  }
  int a = 1;
  int b = 2;
  int temp = 0;
  for(int i=3; i<=n; i++){
    temp = a + b;
    a = b;
    b = temp;
  }
  return temp;
}

动态规划:
三个重要概念:【最优子结构】、【边界】、【状态转移公式】。

上一篇 下一篇

猜你喜欢

热点阅读