General Approach

Top Down - Memoization

public class Solution {
    public static int frogJump(int n, int heights[], int k) {
        // Create an array to store the minimum cost of frog jumps for each position
        int[] dp = new int[n];
        Arrays.fill(dp, -1);

        // Call the helper function to calculate the minimum cost for the last position
        helper(n - 1, k, heights, dp);

        // Return the minimum cost for the last position
        return dp[n - 1];
    }

    private static int helper(int n, int k, int[] heights, int[] dp) {
        // Base case: if the current position is the starting position (index 0), return 0
        if (n == 0) {
            return 0;
        }

        // If the minimum cost for the current position has already been calculated, return it
        if (dp[n] != -1) {
            return dp[n];
        }

        // Initialize the minimum steps variable to a large value
        int minSteps = Integer.MAX_VALUE;

        // Iterate through all possible jumps from 1 to k steps
        for (int j = 1; j <= k; j++) {
            // Check if jumping j steps from the current position is within the array bounds
            if (n - j >= 0) {
                // Calculate the cost of jumping j steps from the current position
                int jump = helper(n - j, k, heights, dp) + Math.abs(heights[n] - heights[n - j]);

                // Update the minimum steps with the smaller value between the current jump and the minimum steps so far
                minSteps = Math.min(minSteps, jump);
            }
        }

        // Store the minimum steps in the dp array for the current position
        return dp[n] = minSteps;
    }
}

Bottom Up - Tabulation

public class Solution {
    public static int frogJump(int n, int heights[], int k) {
        // Create an array to store the minimum cost of frog jumps for each position
        int[] dp = new int[n];
        
        // Initialize the minimum cost for the starting position (index 0)
        dp[0] = 0;
        
        // Iterate through each position and calculate the minimum cost of frog jumps
        for (int i = 1; i < n; i++) {
            // Initialize the minimum steps variable to a large value
            int minSteps = Integer.MAX_VALUE;

            // Iterate through all possible jumps from 1 to k steps
            for (int j = 1; j <= k; j++) {
                // Check if jumping j steps from the current position is within the array bounds
                if (i - j >= 0) {
                    // Calculate the cost of jumping j steps from the current position
                    int jump = dp[i - j] + Math.abs(heights[i] - heights[i - j]);

                    // Update the minimum steps with the smaller value between the current jump and the minimum steps so far
                    minSteps = Math.min(minSteps, jump);
                }
            }
            // Store the minimum steps in the dp array for the current position
            dp[i] = minSteps;
        }

        // Return the minimum cost for the last position
        return dp[n - 1];
    }
}

Last updated

Was this helpful?