算法习题分析(一):上台阶


有一楼梯共m级,刚开始时,你在第一级,若每次只能跨上一级或者二级,要走上m级,共有多少种走法?(注:规定从一级到一级有0种走法)

我们用 int countWays(int n) 函数来求解。这里的n代表楼梯级数,返回值表示上楼的方式数。

由于每次只能上1级或2级台阶,我们用递归的思路,很显然,countWays(n) = countWays(n - 1) + countWays(n - 2),于是就有:

int countWays(int n)
{
    if (n < 3)
    {
        return n;
    }
    else 
    {
        return countWays(n - 1) + countWays(n - 2);
    }
}

这里,很显然,当n为1时,只有一种走法;当n为2时,有两种走法。

这是典型的斐波那契数列,用这种算法会超时。另外,。在计算countWays(n - 1)时,会计算countWays(n - 2)和countWays(n - 3);在计算countWays(n - 2)时,会计算countWays(n - 3)和countWays(n - 4)。以此类推,中间有大量的重复计算。

因此我们采用动态规划的方式来对算法进行改造:

int countWays(int n)
{
    int dp[] = new int[n];
    dp[0] = 0;
    dp[1] = 1;
    dp[2] = 2;
    if (n > 2)
    {
        for (int i = 3; i < n; i++)
        {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
    }
    
    return dp[n - 1];
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 14,672评论 0 89
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,349评论 0 33
  • 有钱人拥有某些习惯,只要学会这些诀窍,慢慢的改变自己,就会带来新的自己,不断野蛮生长,不断新陈代谢。 今天来和大家...
    小尾巴巨人阅读 923评论 0 1
  • 姓名:赵丽萍 公司:宁波大发化纤有限公司 组别:第264期努力二组 【日精进打卡第122天】 【知~学习】 《六项...
    zhaoliping阅读 1,404评论 0 0
  • 2017.11.23第90天。 今天开启新的生活,时间过得快了,吃饭比以前香了,心情也比以前好了,就是去市内办事有...
    鹃花开阅读 1,072评论 0 0