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];
}
}