给定一个非负整数数组,表示最大数量可以从该元素向前迈出的步骤。指针最初位于数组的第一个索引 [0 索引] 处。你的目标是到达最后最少步数中数组的索引。如果无法到达数组末尾,然后打印最大整数。
天真的方法是从初始{主要}组件开始,并递归调用可从第一个元素访问的所有组件。从第一个到达末尾的最小跳转范围是使用从第一个可访问的元素到达末尾所需的最小跳转范围来计算的。
minjumps(start, end) = min ( minjumps(k, end) )for all k accessible from the start
在这里,我们将使用自上而下的动态规划方法。我们将使用 hashmap 来存储子问题结果,每当我们创建解决方案时,首先检查子问题是否已经解决,如果是则使用它。
input: { 1, 2, 4, 1, 2, 2, 1, 1, 3, 8 }output: minimum number of steps = 6 {1-->2-->4-->1-->3-->8}
说明第一个元素是1,所以只能走到2。第二个元素是2,因此最多可以进行 2 个步骤,例如到 4 或 1。从达到 1 到 4,并且依此类推。
寻找最小数的动态规划方法的复杂性到达数组末尾的跳转次数为 o(n^2),空间复杂度为 o(n)
示例 实时演示
#include<stdio.h>#include<limits.h>int min_steps (int arr[], int n){ int steps[n]; int i, j; if (n == 0 || arr[0] == 0) return int_max; steps[0] = 0; for (i = 1; i < n; i++){ steps[i] = int_max; for (j = 0; j < i; j++){ if (i <= j + arr[j] && steps[j] != int_max){ steps[i] = (steps[i] < (steps[j] + 1)) ? steps[i] : steps[j] + 1; break; } } } return steps[n - 1];}int main (){ int arr[100]; int n; printf ("enter size of the array:"); scanf ("%d", &n); printf ("enter elements in the array:"); for (int i = 0; i < n; i++){ scanf ("%d", &arr[i]); } printf ("minimum number of steps : %d", min_steps (arr, n)); return 0;}
输出enter size of array : 7enter elements in the array :2 1 1 5 2 1 1minimum number of steps : 3
以上就是c程序寻找到达末尾的最小跳数的详细内容。