代码展示:
class Solution {int mod=(int)1e9+7;public int waysToStep(int n) {//特殊情况处理if(n==1||n==2){return n;}if(n==3){return 4;}//定义dp数组int[]dp=new int[n+1];//初始化dp[1]=1;dp[2]=2;dp[3]=4;for(int i=4;i<=n;i++){dp[i]=((dp[i-1]+dp[i-2])%mod+dp[i-3])%mod;}return dp[n];}
}
分析:
1.要采用动态规划的方法,首先就要分析该题目状态的表示
我先列出1-5阶台阶的方式数,再来解释其中的规律
台阶数:1 2 3 4 5
方式数:1 2 4 7 13
当台阶数为1时,小孩可以直接上1阶,就1种方式
当台阶数为2时,小孩可以直接上2阶,也可以上到第1阶台阶再上第2阶台阶,而上到第1阶台阶的方式有1种,所以加起来有2种方式
当台阶数为3时,小孩可以直接上3阶,也可以上到第1阶台阶再上到第3阶台阶,而上到第1阶台阶的方式有1种,还可以上到第2阶台阶再上到第3阶台阶,而上到第2阶台阶的方式有2种,所以加起来有1+1+2=4种方式
当台阶数为4时,小孩不能直接上到4阶,但可以上到第1阶台阶再上到第4阶台阶,而上到第1阶台阶的方式有1种,还可以上到第2阶台阶再上到第4阶台阶,而上到第2阶台阶的方式有2种,还可以上到第3阶台阶再上到第4阶台阶,而上到第3阶台阶的方式有4种所以加起来有1+2+4=7种方式
当台阶数为5时,小孩不能直接上到5阶,但可以上到第2阶台阶再上到第5阶台阶,而上到第2阶台阶的方式有2种,还可以上到第3阶台阶再上到第5阶台阶,而上到第3阶台阶的方式有4种,还可以上到第4阶台阶再上到第5阶台阶,而上到第4阶台阶的方式有7种所以加起来有2+4+7=13种方式
我们推算到这里便已经发现规律了,当台阶数为4时,方式数为台阶数为3,2,1方式数的总和,当台阶数为5时,方式数为台阶数为4,3,2方式数的总和
2. 所以我们可以得到动态规划的状态转移方程为dp[i]=dp[i-1]+dp[i-2]+dp[i-3]
3.创建dp数组,进行初始化(根据分析,在i>3时才能用该状态转移方程,所以初始化dp[1],dp[2],dp[3])
4.根据状态转移方程从左到右依次填充dp数组
5.返回dp[n]的值