Climbing Stairs

https://leetcode.com/problems/climbing-stairs/

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

题意:告诉你有n级台阶,每次只能爬一阶或两阶,问共有多少种方法到顶端

思路:第i到第j阶的方法种数依赖于第i+1到第j和第i+2到第j,所以这是一题动态规划,dp(int p,int q)表示第p到第q阶台阶的解法,可以得出dp(p,q)=dp(p+1,q)+dp(p+2,q),一旦p==q||p-q==1的时候表示能够到达或者再走一步就能到达,所以这时候结束递归,表示这是一种解法成功了,所以返回1。由于递归过程中会重复调用一些已经计算过的过程,所以每次返回当前解之前把结果保存起来,如果下次需要用到就直接返回结果。

实现:

public class Solution {
      int[][] a;
      int n;
    public int climbStairs( int n) {
      this. n= n;
        a= new int [n +1][n +1];//用于保存p到q级台阶的结果

        return dp(0,n );
    }
    public int dp(int p , int q){ //用来计算p到q的方法种数
      if( p<0|| q> n|| q==0)
           return 0;
      if( a[ p][ q]!=0) //如果结果集中已经存在这个结果,就直接返回
           return a [p ][q ];

      if( q- p==1|| q== p) //只差一阶或相等的情况,表示当前方法可以到达
           return 1;

      a[ p][ q]=dp( p+1, q)+dp( p+2, q); //第p到第q阶的方法种数依赖于第p+1到第q和第p+2到第q,并且把结果保存起来
      return a[ p][ q];

    }
}

你可能感兴趣的:(LeetCode,dp)