当前位置: 首页 > 知识库问答 >
问题:

到达终点的最小跳跃

邬友樵
2023-03-14

问题声明:给定数组:[1,0,1,0,1,1,1,1,1,0,1,1,1,0]输出:到达结束所需的最小步骤

条件:

  • 0上的步骤是退出

我已经完成了不使用DP的情况下的使用,是否存在针对此问题的DP解决方案。

我的代码:

def minjump(arr):
    n = len(arr)
    if n <= 0 or arr[0] == 0:
        return 0

    index = jump = 0
    while index < n:
        if index == n-1:
            return jump

        if arr[index] == 0 and arr[index+1] == 0:
            return 0

        if arr[index] == 1:
            if index < n-2 and arr[index+2] == 1:
                jump +=1
                index +=2
            else:
                jump += 1
                index += 1
    return jump

共有2个答案

燕涵容
2023-03-14

您可以使用dp解决更一般的问题,在伪代码中,下面的k表示您可以跳转的最大步数:

int n = arr.Length
int dp[n]
for (i = 0 ; i < n; i++) {
    int lowerBound = max(i - k, 0)
    for (j = i - 1; j >= lowerBound; j--) {
        if (arr[j] == 1 && (j == 0 || dp[j] > 0)) {
            dp[i] = min(dp[i], 1 + dp[j])
        }
    }
}
return dp[n - 1]
充阳秋
2023-03-14

一个没有记忆的天真解决方案只是在列表中反复出现,采取一个或两个步骤,并保留所需的最小步骤:

def min_steps(array, current_count, current_position):
   if current_position >= len(array):  # Terminal condition if you've reached the end
       return current_count
   return (
       min(
           min_steps(array, current_count + 1, current_position + 1),
           min_steps(array, current_count + 1, current_position + 2),
       )  # minimum count after taking one step or two
       if array[current_position]  # if current step is valid (non-zero)
       else float("inf")  # else, return float.infinity (fine since we're not imposing types on this prototype)
   )


def minjump(arr):
   result = min_steps(arr, 0, 0)
   return 0 if result == float("inf") else result
 类似资料:
  • 问题:到达终点的最小跳跃次数 给定一个整数数组,其中每个元素表示可以从该元素向前执行的最大步数。编写一个函数返回到达数组末尾的最小跳转次数(从第一个元素开始)。如果一个元素是0,那么我们不能移动该元素。 例子: 输入:arr[]={1,3,5,8,9,2,6,7,6,8,9}输出:3(1- 来源:http://www.geeksforgeeks.org/minimum-number-of-jump

  • 我有一个关于递归的小问题。下面的代码实际上是问题的答案到达终点的最小跳跃次数 当h==l和arr[l]==0时,函数返回sth,函数结束。否则,它将更新一个称为跳跃的变量,但我无法理解该语句。例如,当i=1或i=2时,跳跃的值是多少,依此类推。换句话说,我无法理解变量更新过程的意义。

  • 给定一个数组,从第一个元素开始验证到达终点需要多少步。 示例:arr=[1,3,5,8,4,2,6,7,0,7,9] 1- 3个步骤。 到目前为止,我从极客那里得到了以下代码: 但是我想打印出哪些数字是最短的路径(1-3-8)。我如何调整代码来做到这一点? 我试图创建一个j的列表,但是由于5在循环中进行了测试,所以也添加了它。 问题的链接:https://www.geeksforgeeks.org

  • 我处理下面提供的一个可编码性问题, 斐波那契序列使用以下递归公式定义: 一只小青蛙想去河的对岸。青蛙最初位于河的一边(位置−1),想要到达另一边(位置N)。青蛙可以跳过任何距离F(K),其中F(K)是第K个斐波那契数。幸运的是,河上有许多树叶,青蛙可以在树叶之间跳跃,但只能在N号位置的岸边方向跳跃。 河上的叶子用一个由N个整数组成的数组表示。数组A的连续元素表示从0到N的连续位置− 1在河上。阵列

  • 这是一个数据结构和算法课程的问题,所以我不是在寻找一个具体的或完整的答案,但我希望得到一些提示来帮助我了解我是否在正确的轨道上(或那些可以指出我在正确轨道上的提示) 给定一个位置的无向图,其中节点为位置,道路为边(以遍历某条道路需要多少时间加权),在最大权重为5的情况下,找到能到达所有节点的点*的最小数目。*点是图上的任何点。它们可以在边或节点上。从现在起我就叫他们临界点。 举个例子,如果我们有这

  • 我得到了一个值大于或等于0的整数数组,例如:[5,6,0,4,2,4,1,0,0,4] 我被要求实现一种算法,以从索引0开始的最短“跃点”数遍历数组,其中遍历定义如下: - 如果我选择跳到索引3,它包含值4,我可以从我当前的索引(3)下一次跳到4个点-所以我现在考虑索引4到7作为序列中的下一步。 我的算法必须确定一个最小跳数解,但可以在具有相同跳数的解中任意选择。 对于本示例,以下内容将是有效输出