[动态规划]一次最多上3阶楼梯,最多几种上法

2019-09-23  本文已影响0人  周末的游戏之旅

问题描述

有个小孩在上楼梯,楼梯有N阶,小孩一次可上1阶、2阶、3阶。实现一个算法,计算小孩有多少种上楼梯的方式。输入n返回一个整数。

思路

当楼梯只有一阶时,只有一种方法(1)
楼梯有两阶时,有两种方法(1)(2)
当楼梯有三阶时,有四种方法(111)(12)(21)(22)
当楼梯有n阶时,最后一次上楼的方法为(n-1)+(n-2)+(n-3)

namespace ChildStairs
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(CheckCountWays(4));
        }

        static int CheckCountWays(int n)
        {
            if (n == 1) return 1;
            if (n == 2) return 2;
            if (n == 3) return 4;
            return CheckCountWays(n-1)+ CheckCountWays(n-2)+ CheckCountWays(n - 3);
        }
    }
}

思考

使用递归的方式虽然简单,但效率低,可以采用备忘录式的动态规划进行优化

优化后的解

namespace ChildStairs
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(CountWays(4));
        }

        static int CountWays(int n)
        {
            Dictionary<int, int> dic = new Dictionary<int, int>();
            return CountWaysDP(n, dic);
        }

        static int CountWaysDP(int n,Dictionary<int,int> dic)
        {
            if (n == 1) return 1;
            if (n == 2) return 2;
            if (n == 3) return 4;
            if (dic.ContainsKey(n)) return dic[n];
            dic.Add(n, CountWaysDP(n - 1,dic) + CountWaysDP(n - 2,dic) + CountWaysDP(n - 3,dic));
            return dic[n];
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读