面试题 08.01. 三步问题
面试题 08.01. 三步问题
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
示例1:
输入:n = 3
输出:4
说明: 有四种走法
示例2:
输入:n = 5
输出:13
提示:
n范围在[1, 1000000]之间
为什么可以在过程中取模而不影响最终结果
状态转移方程不用说了:S(n) = S(n-1)+S(n-2)+S(n-3) 因为要对结果S(n)取模,用S(n)'代S(n)取模的结果,即 if S(n) > 1000000007: S(n)'= S(n) - n*1000000007 于是如果对S(n+1)取模有:S(n+1) = S(n) + S(n-1) + S(n-2) = S(n)' + n*1000000007 + S(n-1) + S(n-2) 那么S(n+1) % 1000000007 =( S(n)' + n*1000000007 + S(n-1) + S(n-2))%1000000007= ( S(n)' + S(n-1) + S(n-2) ) % 1000000007,同理 S(n-1),S(n-2), 等于他们的取模和。 即:S(n+1) % 1000000007 = ( S(n)' + S(n-1) ' + S(n-2) ' ) % 1000000007
1 class Solution { 2 public: 3 int waysToStep(int n) { 4 vector<long long> dp(n,0); 5 if(n==0) return 0; 6 else if(n==1) return 1; 7 else if(n==2) return 2; 8 else if(n==3) return 4; 9 dp[0]=1; 10 dp[1]=2; 11 dp[2]=4;//1(到达一级楼梯的方法+一下两步到达三阶)+2(到达2阶楼梯的方法+一步到达三阶)+1(一下三步) 12 for(int i=3;i<n;i++){ 13 dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%1000000007;//中途可能数字越界 14 } 15 return dp[n-1];//dp[n-1]%1000000007; 16 } 17 };