Climbing Stairs

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

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

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

題意:告訴你有n級臺階,每次只能爬一階或兩階,問共有多少種方法到頂端code

思路:第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。因爲遞歸過程當中會重複調用一些已經計算過的過程,因此每次返回當前解以前把結果保存起來,若是下次須要用到就直接返回結果。遞歸

實現:leetcode

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];

    }
}
相關文章
相關標籤/搜索