A child is running up a staircase with N steps, and can hop either 1 step,2steps,3 steps at a time. Count how many possible ways the child can run up the stairs.
class Upstaircase { static void Main(string[] args) { /* Enter your code here. Read input from STDIN. Print output to STDOUT */ //string line1 = System.Console.ReadLine().Trim(); System.Console.WriteLine(Upstaircase.countWaysDP(2,new int[100])); System.Console.WriteLine(Upstaircase.countWaysDP(3, new int[100])); System.Console.WriteLine(Upstaircase.countWaysDP(4, new int[100])); System.Console.WriteLine(Upstaircase.countWaysDP(5, new int[100])); System.Console.WriteLine(Upstaircase.countWaysDP(36, new int[100])); System.Console.WriteLine(Upstaircase.countWaysDP(38, new int[100])); Console.Read(); } //O(3^n). exponential public static int countWays(int n) { if (n<0) { return 0; } else if (n==0) { return 1; } else { return countWays(n - 1) + countWays(n - 2) + countWays(n - 3); } } //DP: dynamic programing. up to 37 will overflowed. Using Long type is just delay but not resolve it. public static int countWaysDP(int n,int[] map) { if (n < 0) { return 0; } else if (n == 0) { return 1; } else if (map[n] > 0) { return map[n]; } else { map[n] = countWaysDP(n - 1, map) + countWaysDP(n - 2,map) + countWaysDP(n - 3,map); return map[n]; } }