给定两个整数N和M ,它们表示坐标系中的位置,任务是通过向左或向右移动步数来计算从该点到原点的路径。
例子:
Input: 3 6
Output: Number of Paths 84
Input: 3 3
Output: Number of Paths 20
我们已经在本文中讨论了这个问题–
计算从点到起点的路径
方法:想法是使用动态编程范例来解决此问题。在此问题中,存在限制,只能在路径中向左或向下移动,因为对于任何点,路径数等于左点的路径数与右点的路径数之和这样,我们就可以自下而上地计算从(0,0)到(N,M)的每个点的路径。在这个问题上减少空间的关键观察是用于计算点(i,j)的解,我们只需要(i-1,j)和(i,j-1)的值,即我们不需要一旦使用了(i-1,j-1)个计算值的一部分,就不再需要它们了。
下面是上述方法的实现:
C++
// C++ implementation to count the
// paths from a points to origin
#include
#include
using namespace std;
// Function to count the paths from
// a point to the origin
long Count_Paths(int x,int y)
{
// Base Case when the point
// is already at origin
if(x == 0 && y == 0)
return 0;
// Base Case when the point
// is on the x or y-axis
if(x == 0 || y == 0)
return 1;
long dp[max(x,y)+1],
p=max(x,y),q=min(x,y);
// Loop to fill all the
// position as 1 in the array
for(int i=0;i<=p;i++)
dp[i]=1;
// Loop to count the number of
// paths from a point to origin
// in bottom-up manner
for(int i=1;i<=q;i++)
for(int j=1;j<=p;j++)
dp[j]+=dp[j-1];
return dp[p];
}
// Driver Code
int main()
{
int x = 3,y = 3;
// Function Call
cout<< "Number of Paths "
<< Count_Paths(x,y);
return 0;
}
Java
// Java implementation to count the
// paths from a points to origin
class GFG {
// Function to count the paths from
// a point to the origin
static long Count_Paths(int x, int y) {
// Base Case when the point
// is already at origin
if (x == 0 && y == 0)
return 0;
// Base Case when the point
// is on the x or y-axis
if (x == 0 || y == 0)
return 1;
int[] dp = new int[Math.max(x, y) + 1];
int p = Math.max(x, y), q = Math.min(x, y);
// Loop to fill all the
// position as 1 in the array
for (int i = 0; i <= p; i++)
dp[i] = 1;
// Loop to count the number of
// paths from a point to origin
// in bottom-up manner
for (int i = 1; i <= q; i++)
for (int j = 1; j <= p; j++)
dp[j] += dp[j - 1];
return dp[p];
}
// Driver Code
public static void main(String[] args) {
int x = 3, y = 3;
// Function Call
System.out.print("Number of Paths " + Count_Paths(x, y));
}
}
// This code contributed by Rajput-Ji
Python3
# Python3 implementation to count the
# paths from a points to origin
# Function to count the paths from
# a point to the origin
def Count_Paths(x, y):
# Base Case when the point
# is already at origin
if (x == 0 and y == 0):
return 0
# Base Case when the point
# is on the x or y-axis
if (x == 0 and y == 0):
return 1
dp = [0] * (max(x, y) + 1)
p = max(x, y)
q = min(x, y)
# Loop to fill all the
# position as 1 in the array
for i in range(p + 1):
dp[i] = 1
# Loop to count the number of
# paths from a point to origin
# in bottom-up manner
for i in range(1, q + 1):
for j in range(1, p + 1):
dp[j] += dp[j - 1]
return dp[p]
# Driver Code
x = 3
y = 3
# Function call
print("Number of Paths ", Count_Paths(x, y))
# This code is contributed by sanjoy_62
C#
// C# implementation to count the
// paths from a points to origin
using System;
class GFG {
// Function to count the paths from
// a point to the origin
static long Count_Paths(int x, int y) {
// Base Case when the point
// is already at origin
if (x == 0 && y == 0)
return 0;
// Base Case when the point
// is on the x or y-axis
if (x == 0 || y == 0)
return 1;
int[] dp = new int[Math.Max(x, y) + 1];
int p = Math.Max(x, y), q = Math.Min(x, y);
// Loop to fill all the
// position as 1 in the array
for (int i = 0; i <= p; i++)
dp[i] = 1;
// Loop to count the number of
// paths from a point to origin
// in bottom-up manner
for (int i = 1; i <= q; i++)
for (int j = 1; j <= p; j++)
dp[j] += dp[j - 1];
return dp[p];
}
// Driver Code
public static void Main(String[] args) {
int x = 3, y = 3;
// Function Call
Console.Write("Number of Paths " + Count_Paths(x, y));
}
}
// This code is contributed by sapnasingh4991
输出:
Number of Paths 20
性能分析:
- 时间复杂度:在上述方法中,有两个循环在最坏的情况下需要O(N * M)个时间。因此,该方法的时间复杂度将为O(N * M) 。
- 空间复杂度:在上述方法中,只有一个数组,其大小最大值为N和M。因此,上述方法的空间复杂度将为O(max(N,M))