📌  相关文章
📜  计算从起步石到终点的方法,每一步最多可跳K

📅  最后修改于: 2021-04-27 20:09:21             🧑  作者: Mango

从左到右连续N个石头。从每块石头中,您最多可以跳到K块石头。任务是找到从sth石头到Nth石头的总路数

例子:

方法:

  1. 假设dp [i]是到达第i个石头的方式的数量。
  2. 由于最多有K个跳跃,因此第i个石头可以被以前的所有K石头所到达。
  3. 迭代所有可能的K跳转,并继续将此可能的组合添加到数组dp []中
  4. 那么从sth石头到达第N个节点的可能方式的总数将是dp [N-1]
  5. 例如:

下面是上述方法的实现:

C++
// C++ program to find total no.of ways
// to reach nth step
#include "bits/stdc++.h"
using namespace std;
  
// Function which returns total no.of ways
// to reach nth step from sth steps
int TotalWays(int n, int s, int k)
{
    // Initialize dp array
    int dp[n];
  
    // filling all the elements with 0
    memset(dp, 0, sizeof(dp));
  
    // Initialize (s-1)th index to 1
    dp[s - 1] = 1;
  
    // Iterate a loop from s to n
    for (int i = s; i < n; i++) {
  
        // starting range for counting ranges
        int idx = max(s - 1, i - k);
  
        // Calculate Maximum moves to
        // Reach ith step
        for (int j = idx; j < i; j++) {
            dp[i] += dp[j];
        }
    }
  
    // For nth step return dp[n-1]
    return dp[n - 1];
}
  
// Driver Code
int main()
{
    // no of steps
    int n = 5;
  
    // Atmost steps allowed
    int k = 2;
  
    // starting range
    int s = 2;
    cout << "Total Ways = "
         << TotalWays(n, s, k);
}


Java
// Java program to find total no.of ways
// to reach nth step
class GFG{
   
// Function which returns total no.of ways
// to reach nth step from sth steps
static int TotalWays(int n, int s, int k)
{
    // Initialize dp array
    int []dp = new int[n];
   
    // Initialize (s-1)th index to 1
    dp[s - 1] = 1;
   
    // Iterate a loop from s to n
    for (int i = s; i < n; i++) {
   
        // starting range for counting ranges
        int idx = Math.max(s - 1, i - k);
   
        // Calculate Maximum moves to
        // Reach ith step
        for (int j = idx; j < i; j++) {
            dp[i] += dp[j];
        }
    }
   
    // For nth step return dp[n-1]
    return dp[n - 1];
}
   
// Driver Code
public static void main(String[] args)
{
    // no of steps
    int n = 5;
   
    // Atmost steps allowed
    int k = 2;
   
    // starting range
    int s = 2;
    System.out.print("Total Ways = "
         + TotalWays(n, s, k));
}
}
  
// This code is contributed by sapnasingh4991


Python3
# Python 3 program to find total no.of ways
# to reach nth step
  
# Function which returns total no.of ways
# to reach nth step from sth steps
def TotalWays(n, s, k):
  
    # Initialize dp array
    dp = [0]*n
  
    # Initialize (s-1)th index to 1
    dp[s - 1] = 1
  
    # Iterate a loop from s to n
    for i in range(s, n):
  
        # starting range for counting ranges
        idx = max(s - 1, i - k)
  
        # Calculate Maximum moves to
        # Reach ith step
        for j in range( idx, i) :
            dp[i] += dp[j]
  
    # For nth step return dp[n-1]
    return dp[n - 1]
  
# Driver Code
if __name__ == "__main__":
    # no of steps
    n = 5
  
    # Atmost steps allowed
    k = 2
  
    # starting range
    s = 2
    print("Total Ways = ", TotalWays(n, s, k))
      
# This code is contributed by chitranayal


C#
// C# program to find total no.of ways
// to reach nth step
using System;
  
class GFG{
       
    // Function which returns total no.of ways
    // to reach nth step from sth steps
    static int TotalWays(int n, int s, int k)
    {
        // Initialize dp array
        int []dp = new int[n];
       
        // Initialize (s-1)th index to 1
        dp[s - 1] = 1;
       
        // Iterate a loop from s to n
        for (int i = s; i < n; i++) {
       
            // starting range for counting ranges
            int idx = Math.Max(s - 1, i - k);
       
            // Calculate Maximum moves to
            // Reach ith step
            for (int j = idx; j < i; j++) {
                dp[i] += dp[j];
            }
        }
       
        // For nth step return dp[n-1]
        return dp[n - 1];
    }
       
    // Driver Code
    public static void Main(string[] args)
    {
        // no of steps
        int n = 5;
       
        // Atmost steps allowed
        int k = 2;
       
        // starting range
        int s = 2;
        Console.Write("Total Ways = "+ TotalWays(n, s, k));
    }
}
  
// This code is contributed by Yash_R


输出:
Total Ways = 3

时间复杂度: O(N 2 ),其中N是结石数。