爬楼梯
假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?
样例
View Code
比如n=3,1+1+1=1+2=2+1=3,共有3中不同的方法
返回 3
用递归又超时了。。于是又换了DP,dp并不熟悉,于是又搞了好久。
首先向右是跳一格,向下是跳两格,dp[j]是到达(i,j)的不同的路径数,把每一行最左的剩余步数为0的点的路径数求和就是答案。
1 public class Solution { 2 /** 3 * @param n: An integer 4 * @return: An integer 5 */ 6 int sum = 0; 7 public int climbStairs(int n) { 8 sum = 1; 9 // climb(n); 10 // return sum; 11 int[] dp = new int[n+1]; 12 for(int i=0;i<n+1;i++) { 13 dp[i] = 1; 14 } 15 n -= 2; 16 while(n >= 0) { 17 int j; 18 for(j=1; j<n+1; j++) { 19 dp[j] += dp[j-1]; 20 } 21 sum+=dp[j-1]; 22 n -= 2; 23 } 24 25 return sum; 26 } 27 28 public void climb(int n) { 29 if(n == 0) sum++; 30 else if(n == 1) sum++; 31 else if(n == 2) sum += 2; 32 else if(n == 3) sum += 3; 33 else { 34 if(n > 3) climb(n-1); 35 if(n > 3) climb(n-2); 36 } 37 return; 38 } 39 }