爬楼梯(LintCode)

爬楼梯

假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?

样例

比如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 }
View Code

 

posted @ 2015-12-06 17:55  -.-|  阅读(445)  评论(0编辑  收藏  举报