有n个楼梯,一个站在底部的人想到达顶部。此人可以一次爬1阶或2阶。数一数,人就可以达到顶峰。
考虑图中所示的示例。 n的值是3。有3种方法可以到达顶部。该图取自更简单的斐波那契难题
例子:
Input: n = 1
Output: 1
There is only one way to climb 1 stair
Input: n = 2
Output: 2
There are two ways: (1, 1) and (2)
Input: n = 4
Output: 5
(1, 1, 1, 1), (1, 1, 2), (2, 1, 1), (1, 2, 1), (2, 2)
方法1 :第一种方法使用递归技术来解决此问题。
方法:在上述问题中,我们可以轻松地找到递归性质。人可以从第(n-1)个楼梯或从第(n-2)个楼梯到达第n个楼梯。因此,对于每个楼梯N,我们试图找出方法来达到N-1个楼梯和n-2个楼梯,并添加他们给第n个楼梯答案的数量。因此,这种方法的表达式为:
ways(n) = ways(n-1) + ways(n-2)
上面的表达式实际上是斐波那契数的表达式,但是有一点要注意,Ways(n)的值等于fibonacci(n + 1)。
ways(1) = fib(2) = 1
ways(2) = fib(3) = 2
ways(3) = fib(4) = 3
为了更好的理解,让我们参考下面的递归树:
Input: N = 4
fib(5)
'3' / \ '2'
/ \
fib(4) fib(3)
'2' / \ '1' / \
/ \ / \
fib(3) fib(2)fib(2) fib(1)
/ \ '1' / \ '0'
'1' / '1'\ / \
/ \ fib(1) fib(0)
fib(2) fib(1)
因此,我们可以使用斐波那契数的函数来查找Ways(n)的值。以下是上述想法的C++实现。
C++
// C++ program to count number of
// ways to reach Nth stair
#include
using namespace std;
// A simple recursive program to
// find N'th fibonacci number
int fib(int n)
{
if (n <= 1)
return n;
return fib(n - 1) + fib(n - 2);
}
// Returns number of ways to
// reach s'th stair
int countWays(int s)
{
return fib(s + 1);
}
// Driver C
int main()
{
int s = 4;
cout << "Number of ways = " << countWays(s);
return 0;
}
// This code is contributed by shubhamsingh10
C
// C Program to count number of
// ways to reach Nth stair
#include
// A simple recursive program to
// find n'th fibonacci number
int fib(int n)
{
if (n <= 1)
return n;
return fib(n - 1) + fib(n - 2);
}
// Returns number of ways to reach s'th stair
int countWays(int s)
{
return fib(s + 1);
}
// Driver program to test above functions
int main()
{
int s = 4;
printf("Number of ways = %d", countWays(s));
getchar();
return 0;
}
Java
class stairs {
// A simple recursive program to find
// n'th fibonacci number
static int fib(int n)
{
if (n <= 1)
return n;
return fib(n - 1) + fib(n - 2);
}
// Returns number of ways to reach s'th stair
static int countWays(int s)
{
return fib(s + 1);
}
/* Driver program to test above function */
public static void main(String args[])
{
int s = 4;
System.out.println("Number of ways = " + countWays(s));
}
} /* This code is contributed by Rajat Mishra */
Python
# Python program to count
# ways to reach nth stair
# Recursive function to find
# Nth fibonacci number
def fib(n):
if n <= 1:
return n
return fib(n-1) + fib(n-2)
# Returns no. of ways to
# reach sth stair
def countWays(s):
return fib(s + 1)
# Driver program
s = 4
print "Number of ways = ",
print countWays(s)
# Contributed by Harshit Agrawal
C#
// C# program to count the
// number of ways to reach
// n'th stair
using System;
class GFG {
// A simple recursive
// program to find n'th
// fibonacci number
static int fib(int n)
{
if (n <= 1)
return n;
return fib(n - 1) + fib(n - 2);
}
// Returns number of ways
// to reach s'th stair
static int countWays(int s)
{
return fib(s + 1);
}
// Driver Code
static public void Main()
{
int s = 4;
Console.WriteLine("Number of ways = " + countWays(s));
}
}
// This code is contributed
// by akt_mit
PHP
Javascript
C++
// C++ program to count number of ways
// to reach nth stair when a person
// can climb either 1 or 2 stairs at a time
#include
using namespace std;
// A recursive function used by countWays
int countWaysUtil(int n, int m)
{
if (n <= 1)
{
return n;
}
int res = 0;
for(int i = 1; i <= m && i <= n; i++)
{
res += countWaysUtil(n - i, m);
}
return res;
}
// Returns number of ways to reach s'th stair
int countWays(int s, int m)
{
return countWaysUtil(s + 1, m);
}
// Driver code
int main()
{
int s = 4, m = 2;
cout << "Number of ways = " << countWays(s, m);
return 0;
}
// This code is contribute by shubhamsingh10
C
// C program to count number of ways
// to reach nth stair when a person
// can climb either 1 or 2 stairs at a time
#include
// A recursive function used by countWays
int countWaysUtil(int n, int m)
{
if (n <= 1)
return n;
int res = 0;
for (int i = 1; i <= m && i <= n; i++)
res += countWaysUtil(n - i, m);
return res;
}
// Returns number of ways to reach s'th stair
int countWays(int s, int m)
{
return countWaysUtil(s + 1, m);
}
// Driver program to test above functions-
int main()
{
int s = 4, m = 2;
printf("Number of ways = %d", countWays(s, m));
return 0;
}
Java
class stairs {
// A recursive function used by countWays
static int countWaysUtil(int n, int m)
{
if (n <= 1)
return n;
int res = 0;
for (int i = 1; i <= m && i <= n; i++)
res += countWaysUtil(n - i, m);
return res;
}
// Returns number of ways to reach s'th stair
static int countWays(int s, int m)
{
return countWaysUtil(s + 1, m);
}
/* Driver program to test above function */
public static void main(String args[])
{
int s = 4, m = 2;
System.out.println("Number of ways = "
+ countWays(s, m));
}
} /* This code is contributed by Rajat Mishra */
Python
# A program to count the number of ways
# to reach n'th stair
# Recursive function used by countWays
def countWaysUtil(n, m):
if n <= 1:
return n
res = 0
i = 1
while i<= m and i<= n:
res = res + countWaysUtil(n-i, m)
i = i + 1
return res
# Returns number of ways to reach s'th stair
def countWays(s, m):
return countWaysUtil(s + 1, m)
# Driver program
s, m = 4, 2
print "Number of ways =", countWays(s, m)
# Contributed by Harshit Agrawal
PHP
Javascript
C++
// C++ program to count number of ways
// to reach n'th stair when a person
// can climb 1, 2, ..m stairs at a time
#include
using namespace std;
// A recursive function used by countWays
int countWaysUtil(int n, int m)
{
int res[n];
res[0] = 1;
res[1] = 1;
for(int i = 2; i < n; i++)
{
res[i] = 0;
for(int j = 1; j <= m && j <= i; j++)
res[i] += res[i - j];
}
return res[n - 1];
}
// Returns number of ways to reach s'th stair
int countWays(int s, int m)
{
return countWaysUtil(s + 1, m);
}
// Driver code
int main()
{
int s = 4, m = 2;
cout << "Number of ways = "
<< countWays(s, m);
return 0;
}
// This code is contributed by shubhamsingh10
C
// A C program to count number of ways
// to reach n'th stair when
// a person can climb 1, 2, ..m stairs at a time
#include
// A recursive function used by countWays
int countWaysUtil(int n, int m)
{
int res[n];
res[0] = 1;
res[1] = 1;
for (int i = 2; i < n; i++) {
res[i] = 0;
for (int j = 1; j <= m && j <= i; j++)
res[i] += res[i - j];
}
return res[n - 1];
}
// Returns number of ways to reach s'th stair
int countWays(int s, int m)
{
return countWaysUtil(s + 1, m);
}
// Driver program to test above functions
int main()
{
int s = 4, m = 2;
printf("Number of ways = %d", countWays(s, m));
return 0;
}
Java
// Java program to count number of ways
// to reach n't stair when a person
// can climb 1, 2, ..m stairs at a time
class GFG {
// A recursive function used by countWays
static int countWaysUtil(int n, int m)
{
int res[] = new int[n];
res[0] = 1;
res[1] = 1;
for (int i = 2; i < n; i++) {
res[i] = 0;
for (int j = 1; j <= m && j <= i; j++)
res[i] += res[i - j];
}
return res[n - 1];
}
// Returns number of ways to reach s'th stair
static int countWays(int s, int m)
{
return countWaysUtil(s + 1, m);
}
// Driver method
public static void main(String[] args)
{
int s = 4, m = 2;
System.out.println("Number of ways = "
+ countWays(s, m));
}
}
Python
# A program to count the number of
# ways to reach n'th stair
# Recursive function used by countWays
def countWaysUtil(n, m):
# Creates list res with all elements 0
res = [0 for x in range(n)]
res[0], res[1] = 1, 1
for i in range(2, n):
j = 1
while j<= m and j<= i:
res[i] = res[i] + res[i-j]
j = j + 1
return res[n-1]
# Returns number of ways to reach s'th stair
def countWays(s, m):
return countWaysUtil(s + 1, m)
# Driver Program
s, m = 4, 2
print "Number of ways =", countWays(s, m)
# Contributed by Harshit Agrawal
C#
// C# program to count number
// of ways to reach n'th stair when
// a person can climb 1, 2, ..m
// stairs at a time
using System;
class GFG {
// A recursive function
// used by countWays
static int countWaysUtil(int n, int m)
{
int[] res = new int[n];
res[0] = 1;
res[1] = 1;
for (int i = 2; i < n; i++) {
res[i] = 0;
for (int j = 1; j <= m && j <= i; j++)
res[i] += res[i - j];
}
return res[n - 1];
}
// Returns number of ways
// to reach s'th stair
static int countWays(int s, int m)
{
return countWaysUtil(s + 1, m);
}
// Driver Code
public static void Main()
{
int s = 4, m = 2;
Console.WriteLine("Number of ways = "
+ countWays(s, m));
}
}
// This code is contributed by anuj_67.
PHP
Javascript
C++
// A C++ program to count the number of ways
// to reach n'th stair when user
// climb 1 .. m stairs at a time.
// Contributor: rsampaths16
#include
using namespace std;
// Returns number of ways
// to reach s'th stair
int countWays(int n, int m)
{
int res[n + 1];
int temp = 0;
res[0] = 1;
for (int i = 1; i <= n; i++)
{
int s = i - m - 1;
int e = i - 1;
if (s >= 0)
{
temp -= res[s];
}
temp += res[e];
res[i] = temp;
}
return res[n];
}
// Driver Code
int main()
{
int n = 5, m = 3;
cout << "Number of ways = "
<< countWays(n, m);
return 0;
}
// This code is contributed by shubhamsingh10
C
// A C program to count the number of ways
// to reach n'th stair when user
// climb 1 .. m stairs at a time.
// Contributor: rsampaths16
#include
// Returns number of ways
// to reach s'th stair
int countWays(int n, int m)
{
int res[n + 1];
int temp = 0;
res[0] = 1;
for (int i = 1; i <= n; i++) {
int s = i - m - 1;
int e = i - 1;
if (s >= 0) {
temp -= res[s];
}
temp += res[e];
res[i] = temp;
}
return res[n];
}
// Driver Code
int main()
{
int n = 5, m = 3;
printf("Number of ways = %d",
countWays(n, m));
return 0;
}
Java
// Java program to count number of
// ways to reach n't stair when a
// person can climb 1, 2, ..m
// stairs at a time
class GFG{
// Returns number of ways
// to reach s'th stair
static int countWays(int n, int m)
{
int res[] = new int[n + 1];
int temp = 0;
res[0] = 1;
for(int i = 1; i <= n; i++)
{
int s = i - m - 1;
int e = i - 1;
if (s >= 0)
{
temp -= res[s];
}
temp += res[e];
res[i] = temp;
}
return res[n];
}
// Driver Code
public static void main(String[] args)
{
int n = 5, m = 3;
System.out.println("Number of ways = " +
countWays(n, m));
}
}
// This code is contributed by equbalzeeshan
Python3
# Python3 program to count the number
# of ways to reach n'th stair when
# user climb 1 .. m stairs at a time.
# Function to count number of ways
# to reach s'th stair
def countWays(n, m):
temp = 0
res = [1]
for i in range(1, n + 1):
s = i - m - 1
e = i - 1
if (s >= 0):
temp -= res[s]
temp += res[e]
res.append(temp)
return res[n]
# Driver Code
n = 5
m = 3
print('Number of ways =', countWays(n, m))
# This code is contributed by 31ajaydandge
C#
// C# program to count number of
// ways to reach n'th stair when
// a person can climb 1, 2, ..m
// stairs at a time
using System;
class GFG{
// Returns number of ways
// to reach s'th stair
static int countWays(int n, int m)
{
int[] res = new int[n + 1];
int temp = 0;
res[0] = 1;
for(int i = 1; i <= n; i++)
{
int s = i - m - 1;
int e = i - 1;
if (s >= 0)
{
temp -= res[s];
}
temp += res[e];
res[i] = temp;
}
return res[n];
}
// Driver Code
public static void Main()
{
int n = 5, m = 3;
Console.WriteLine("Number of ways = " +
countWays(n, m));
}
}
// This code is contributed by equbalzeeshan
C++
#include
using namespace std;
int main() {
int n;
n=5;
// Here n/2 is done to count the number 2's in n
// 1 is added for case where there is no 2.
// eg: if n=4 ans will be 3.
// {1,1,1,1} set having no 2.
// {1,1,2} ans {2,2} (n/2) sets contaning 2.
cout<<"Number of ways when order of steps does not matter is : "<<1+(n/2)<
Python3
n = 5
# Here n/2 is done to count the number 2's in n
# 1 is added for case where there is no 2.
# eg: if n=4 ans will be 3.
# {1,1,1,1} set having no 2.
# {1,1,2} ans {2,2} (n/2) sets contaning 2.
print("Number of ways when order "
"of steps does not matter is : ", 1 + (n // 2))
# This code is contributed by rohitsingh07052
Javascript
输出:
Number of ways = 5
复杂度分析:
- 时间复杂度: O(2 ^ n)
由于冗余计算,上述实现的时间复杂度是指数级的(黄金比例提高到幂n),可以使用前面讨论的Fibonacci函数优化对其进行优化以使其在O(Logn)时间内工作。 - 辅助空间: O(1)
问题的概括
如果一个人可以在给定的值m上爬上m个楼梯,该如何计算路数。例如,如果m为4,则该人可以一次爬1阶或2阶或3阶或4阶。
方法:对于上述方法的一般化,可以使用以下递归关系。
ways(n, m) = ways(n-1, m) + ways(n-2, m) + ... ways(n-m, m)
在这种方法中,要达到第n个楼梯,请尝试从当前楼梯爬上所有小于等于n的楼梯。
以下是上述重复的实现。
C++
// C++ program to count number of ways
// to reach nth stair when a person
// can climb either 1 or 2 stairs at a time
#include
using namespace std;
// A recursive function used by countWays
int countWaysUtil(int n, int m)
{
if (n <= 1)
{
return n;
}
int res = 0;
for(int i = 1; i <= m && i <= n; i++)
{
res += countWaysUtil(n - i, m);
}
return res;
}
// Returns number of ways to reach s'th stair
int countWays(int s, int m)
{
return countWaysUtil(s + 1, m);
}
// Driver code
int main()
{
int s = 4, m = 2;
cout << "Number of ways = " << countWays(s, m);
return 0;
}
// This code is contribute by shubhamsingh10
C
// C program to count number of ways
// to reach nth stair when a person
// can climb either 1 or 2 stairs at a time
#include
// A recursive function used by countWays
int countWaysUtil(int n, int m)
{
if (n <= 1)
return n;
int res = 0;
for (int i = 1; i <= m && i <= n; i++)
res += countWaysUtil(n - i, m);
return res;
}
// Returns number of ways to reach s'th stair
int countWays(int s, int m)
{
return countWaysUtil(s + 1, m);
}
// Driver program to test above functions-
int main()
{
int s = 4, m = 2;
printf("Number of ways = %d", countWays(s, m));
return 0;
}
Java
class stairs {
// A recursive function used by countWays
static int countWaysUtil(int n, int m)
{
if (n <= 1)
return n;
int res = 0;
for (int i = 1; i <= m && i <= n; i++)
res += countWaysUtil(n - i, m);
return res;
}
// Returns number of ways to reach s'th stair
static int countWays(int s, int m)
{
return countWaysUtil(s + 1, m);
}
/* Driver program to test above function */
public static void main(String args[])
{
int s = 4, m = 2;
System.out.println("Number of ways = "
+ countWays(s, m));
}
} /* This code is contributed by Rajat Mishra */
Python
# A program to count the number of ways
# to reach n'th stair
# Recursive function used by countWays
def countWaysUtil(n, m):
if n <= 1:
return n
res = 0
i = 1
while i<= m and i<= n:
res = res + countWaysUtil(n-i, m)
i = i + 1
return res
# Returns number of ways to reach s'th stair
def countWays(s, m):
return countWaysUtil(s + 1, m)
# Driver program
s, m = 4, 2
print "Number of ways =", countWays(s, m)
# Contributed by Harshit Agrawal
的PHP
Java脚本
输出:
Number of ways = 5
复杂度分析:
- 时间复杂度: O(2 ^ n)
由于冗余计算,上述实现方式的时间复杂度是指数级的(黄金比例提高到幂n)。可以使用动态编程将其优化为O(m * n)。 - 辅助空间: O(1)
方法2 :此方法使用动态编程技术来得出解决方案。
方法:我们使用以下关系以自底向上的方式创建表res [] :
res[i] = res[i] + res[i-j] for every (i-j) >= 0
使得阵列的第i个指数将包含的路的数目需要达到第i个步骤考虑攀登的所有可能性(即,从1到i)。
下面的代码实现了上述方法:
C++
// C++ program to count number of ways
// to reach n'th stair when a person
// can climb 1, 2, ..m stairs at a time
#include
using namespace std;
// A recursive function used by countWays
int countWaysUtil(int n, int m)
{
int res[n];
res[0] = 1;
res[1] = 1;
for(int i = 2; i < n; i++)
{
res[i] = 0;
for(int j = 1; j <= m && j <= i; j++)
res[i] += res[i - j];
}
return res[n - 1];
}
// Returns number of ways to reach s'th stair
int countWays(int s, int m)
{
return countWaysUtil(s + 1, m);
}
// Driver code
int main()
{
int s = 4, m = 2;
cout << "Number of ways = "
<< countWays(s, m);
return 0;
}
// This code is contributed by shubhamsingh10
C
// A C program to count number of ways
// to reach n'th stair when
// a person can climb 1, 2, ..m stairs at a time
#include
// A recursive function used by countWays
int countWaysUtil(int n, int m)
{
int res[n];
res[0] = 1;
res[1] = 1;
for (int i = 2; i < n; i++) {
res[i] = 0;
for (int j = 1; j <= m && j <= i; j++)
res[i] += res[i - j];
}
return res[n - 1];
}
// Returns number of ways to reach s'th stair
int countWays(int s, int m)
{
return countWaysUtil(s + 1, m);
}
// Driver program to test above functions
int main()
{
int s = 4, m = 2;
printf("Number of ways = %d", countWays(s, m));
return 0;
}
Java
// Java program to count number of ways
// to reach n't stair when a person
// can climb 1, 2, ..m stairs at a time
class GFG {
// A recursive function used by countWays
static int countWaysUtil(int n, int m)
{
int res[] = new int[n];
res[0] = 1;
res[1] = 1;
for (int i = 2; i < n; i++) {
res[i] = 0;
for (int j = 1; j <= m && j <= i; j++)
res[i] += res[i - j];
}
return res[n - 1];
}
// Returns number of ways to reach s'th stair
static int countWays(int s, int m)
{
return countWaysUtil(s + 1, m);
}
// Driver method
public static void main(String[] args)
{
int s = 4, m = 2;
System.out.println("Number of ways = "
+ countWays(s, m));
}
}
Python
# A program to count the number of
# ways to reach n'th stair
# Recursive function used by countWays
def countWaysUtil(n, m):
# Creates list res with all elements 0
res = [0 for x in range(n)]
res[0], res[1] = 1, 1
for i in range(2, n):
j = 1
while j<= m and j<= i:
res[i] = res[i] + res[i-j]
j = j + 1
return res[n-1]
# Returns number of ways to reach s'th stair
def countWays(s, m):
return countWaysUtil(s + 1, m)
# Driver Program
s, m = 4, 2
print "Number of ways =", countWays(s, m)
# Contributed by Harshit Agrawal
C#
// C# program to count number
// of ways to reach n'th stair when
// a person can climb 1, 2, ..m
// stairs at a time
using System;
class GFG {
// A recursive function
// used by countWays
static int countWaysUtil(int n, int m)
{
int[] res = new int[n];
res[0] = 1;
res[1] = 1;
for (int i = 2; i < n; i++) {
res[i] = 0;
for (int j = 1; j <= m && j <= i; j++)
res[i] += res[i - j];
}
return res[n - 1];
}
// Returns number of ways
// to reach s'th stair
static int countWays(int s, int m)
{
return countWaysUtil(s + 1, m);
}
// Driver Code
public static void Main()
{
int s = 4, m = 2;
Console.WriteLine("Number of ways = "
+ countWays(s, m));
}
}
// This code is contributed by anuj_67.
的PHP
Java脚本
输出:
Number of ways = 5
复杂度分析:
- 时间复杂度: O(m * n)
- 辅助空间: O(n)
方法3 :第三种方法使用滑动窗口技术得出解决方案。
方法:该方法有效地实现了上述动态编程方法。
在这种方法中第i个楼梯,我们保持过去的M个可能的楼梯和的窗口,从中我们可以爬到第i个台阶。代替运行内部循环,我们将内部循环的结果保存在一个临时变量中。我们删除前一个窗口的元素,然后添加当前窗口的元素,并更新总和。
下面的代码实现了上述想法
C++
// A C++ program to count the number of ways
// to reach n'th stair when user
// climb 1 .. m stairs at a time.
// Contributor: rsampaths16
#include
using namespace std;
// Returns number of ways
// to reach s'th stair
int countWays(int n, int m)
{
int res[n + 1];
int temp = 0;
res[0] = 1;
for (int i = 1; i <= n; i++)
{
int s = i - m - 1;
int e = i - 1;
if (s >= 0)
{
temp -= res[s];
}
temp += res[e];
res[i] = temp;
}
return res[n];
}
// Driver Code
int main()
{
int n = 5, m = 3;
cout << "Number of ways = "
<< countWays(n, m);
return 0;
}
// This code is contributed by shubhamsingh10
C
// A C program to count the number of ways
// to reach n'th stair when user
// climb 1 .. m stairs at a time.
// Contributor: rsampaths16
#include
// Returns number of ways
// to reach s'th stair
int countWays(int n, int m)
{
int res[n + 1];
int temp = 0;
res[0] = 1;
for (int i = 1; i <= n; i++) {
int s = i - m - 1;
int e = i - 1;
if (s >= 0) {
temp -= res[s];
}
temp += res[e];
res[i] = temp;
}
return res[n];
}
// Driver Code
int main()
{
int n = 5, m = 3;
printf("Number of ways = %d",
countWays(n, m));
return 0;
}
Java
// Java program to count number of
// ways to reach n't stair when a
// person can climb 1, 2, ..m
// stairs at a time
class GFG{
// Returns number of ways
// to reach s'th stair
static int countWays(int n, int m)
{
int res[] = new int[n + 1];
int temp = 0;
res[0] = 1;
for(int i = 1; i <= n; i++)
{
int s = i - m - 1;
int e = i - 1;
if (s >= 0)
{
temp -= res[s];
}
temp += res[e];
res[i] = temp;
}
return res[n];
}
// Driver Code
public static void main(String[] args)
{
int n = 5, m = 3;
System.out.println("Number of ways = " +
countWays(n, m));
}
}
// This code is contributed by equbalzeeshan
Python3
# Python3 program to count the number
# of ways to reach n'th stair when
# user climb 1 .. m stairs at a time.
# Function to count number of ways
# to reach s'th stair
def countWays(n, m):
temp = 0
res = [1]
for i in range(1, n + 1):
s = i - m - 1
e = i - 1
if (s >= 0):
temp -= res[s]
temp += res[e]
res.append(temp)
return res[n]
# Driver Code
n = 5
m = 3
print('Number of ways =', countWays(n, m))
# This code is contributed by 31ajaydandge
C#
// C# program to count number of
// ways to reach n'th stair when
// a person can climb 1, 2, ..m
// stairs at a time
using System;
class GFG{
// Returns number of ways
// to reach s'th stair
static int countWays(int n, int m)
{
int[] res = new int[n + 1];
int temp = 0;
res[0] = 1;
for(int i = 1; i <= n; i++)
{
int s = i - m - 1;
int e = i - 1;
if (s >= 0)
{
temp -= res[s];
}
temp += res[e];
res[i] = temp;
}
return res[n];
}
// Driver Code
public static void Main()
{
int n = 5, m = 3;
Console.WriteLine("Number of ways = " +
countWays(n, m));
}
}
// This code is contributed by equbalzeeshan
输出:
Number of ways = 13
复杂度分析:
- 时间复杂度: O(n)
- 辅助空间: O(n)
方法4 :第四种方法使用简单的数学方法,但这仅适用于在计算步数时(顺序无关紧要)的问题。
方法:在此方法中,我们仅计算具有2的集合的数量。
C++
#include
using namespace std;
int main() {
int n;
n=5;
// Here n/2 is done to count the number 2's in n
// 1 is added for case where there is no 2.
// eg: if n=4 ans will be 3.
// {1,1,1,1} set having no 2.
// {1,1,2} ans {2,2} (n/2) sets contaning 2.
cout<<"Number of ways when order of steps does not matter is : "<<1+(n/2)<
Python3
n = 5
# Here n/2 is done to count the number 2's in n
# 1 is added for case where there is no 2.
# eg: if n=4 ans will be 3.
# {1,1,1,1} set having no 2.
# {1,1,2} ans {2,2} (n/2) sets contaning 2.
print("Number of ways when order "
"of steps does not matter is : ", 1 + (n // 2))
# This code is contributed by rohitsingh07052
Java脚本
输出:
Number of ways when order of steps does not matter is : 3
复杂度分析:
- 时间复杂度: O(1)
- 空间复杂度: O(1)
注意:此方法仅适用于问题计数方式至第N个楼梯(顺序无关紧要)。
顺序无关紧要,因为n = 4 {1 2 1},{2 1 1}和{1 1 2}被认为是相同的。