Climbing Stairs

来源:互联网 发布:洛克人网络争霸战ed 编辑:程序博客网 时间:2024/06/11 06:59

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];    }}
0 0
原创粉丝点击