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