本文共 971 字,大约阅读时间需要 3 分钟。
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。示例 1:
输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1、 1 阶 + 1 阶 2、2 阶示例 2:
输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1、1 阶 + 1 阶 + 1 阶 2、1 阶 + 2 阶 3、2 阶 + 1 阶暴力搜索,回溯法
//超时class Solution { public: int climbStairs(int n) { if (n == 1 || n == 2){ return n; } return climbStairs(n - 1) + climbStairs(n - 2); }};
第i阶的爬法数量 = 第i-1阶的爬法数量 + 第i-2阶的爬法数量
算法思路: 1、设置递推数组dp[0……n],dp[i]代表到达第i阶,有多少种走法,初始化数组元素为0 2、设置到达第1阶台阶,有1种走法,到达第2阶台阶有2种走法 3、利用i循环递推从第3阶至第n阶结果class Solution { public: int climbStairs(int n) { vector dp(n+3, 0); dp[1] = 1; dp[2] = 2; for (int i = 3; i <= n; i++){ dp[i] = dp[i-1] + dp[i-2]; } return dp[n]; }};
动态规划原理:
1、确认原问题与子问题 2、确认状态: 本题的动态规划状态单一,第i个状态即为i阶台阶的所有走法数量 3、确认边界状态的值: 边界状态为1阶台阶与2阶台阶的走法 4、确认状态转移方程: 将求第i个状态的值转移为求第i-1个状态值与第i-2个状态的值,动态规划转移方程,dp[i] = dp[i-1] + dp[i-2] ;(i >= 3)转载地址:http://lvxmb.baihongyu.com/