Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

โปรแกรม C หาจำนวนขั้นตอนน้อยที่สุด (Minimum Jumps) เพื่อถึงปลายอาร์เรย์

ให้อาร์เรย์จำนวนเต็มไม่ติดลบ แสดงจำนวนขั้นตอนสูงสุดที่ก้าวไปข้างหน้าได้จากตำแหน่งนั้น เริ่มต้นที่ดัชนี 0 เป้าหมาย: ถึงดัชนีสุดท้ายในขั้นตอนน้อยที่สุด ถ้าไม่ถึงได้ พิมพ์ค่าสูงสุดของ int

Naive approach เริ่มจากสมาชิกแรก เรียกเวียน (recursive) สำหรับทุกสมาชิกที่เข้าถึงได้ minJumps(start, end) = Min(minJumps(k, end)) สำหรับ k ทุกตัวที่เข้าถึงได้จาก start

ใช้ Dynamic Programming แบบ Top-down ใช้ Hashmap เก็บผลลัพธ์ subproblem

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) เลือกไป 4 ...

Complexity: O(n²) time, O(n) space

ตัวอย่างโค้ด

#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 : 7
Enter elements in the array : 2 1 1 5 2 1 1
Minimum number of steps : 3