【leetcode hot 100 70】爬楼梯
解法一:(动态规划)num[i]表示i有几种不同的方法可以爬到楼顶n
动态规划方程为:
n
u
m
[
i
]
=
{
0
,
i
=
n
1
,
i
=
n
−
1
,
n
−
2
∑
i
+
1
i
+
3
n
u
m
[
j
]
,
o
t
h
e
r
s
num[i]=\begin{array}{l} \left\{\begin{matrix} 0,i=n\\ 1,i=n-1,n-2\\ \sum_{i+1}^{i+3} num[j],others \end{matrix}\right. \end{array}
num[i]=⎩
⎨
⎧0,i=n1,i=n−1,n−2∑i+1i+3num[j],others
import java.util.*;
/**
* @author longyy
* @version 1.0
*/
class Solution79 {
public int climbStairs(int n) {
if(n == 0) return 0;
if(n == 1) return 1;
int[] nums = new int[n+1];
nums[n] = 0;
nums[n-1] = 1;
nums[n - 2] = 2;
if(n > 2){
for(int i = n-3; i >= 0; i--){
for(int j = i+1; j-i < 3; j++){
nums[i] += nums[j];
}
}
}
return nums[0];
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
Solution79 sol = new Solution79();
System.out.println(sol.climbStairs(n));
}
}
注意:
- 累加nums时,
j∈[i+1,i+3)
保证只走1或2步 dp
初始化为dp[n+1]
,dp[i]
表示i到n可以有多少种走法;初始状态为nums[n] = 0; nums[n-1] = 1; nums[n - 2] = 2;
,返回值为dp[0]