Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Chương trình C tìm số bước nhảy tối thiểu đến cuối mảng


Cho mảng số nguyên không âm, mỗi phần tử là số bước nhảy tối đa từ vị trí đó. Bắt đầu từ chỉ số 0, mục tiêu đến chỉ số cuối cùng với số bước nhảy tối thiểu. Nếu không thể đến cuối, in giá trị lớn nhất (INT_MAX).

Cách tiếp cận наи vẹt (naive): đệ quy từ phần tử đầu, thử tất cả vị trí erreichable. minJumps(start, end) = Min(minJumps(k, end)) cho mọi k erreichable từ start.

Dùng Dynamic Programming top-down với Hashmap lưu kết quả bài toán con.

Input: {1, 2, 4, 1, 2, 2, 1, 1, 3, 8}
Output: Minimum steps = 6 {1→2→4→1→3→8}

Giải thích

Phần tử đầu = 1 → chỉ nhảy đến 2. Phần tử 2 = 2 → nhảy tối đa 2 bước (đến 4 hoặc 1). Chọn 4... đến cuối.

Độ phức tạp DP: O(n²) thời gian, O(n) không gian.

Ví dụ mã nguồ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], n;
    printf("Nhap kich thuoc mang: ");
    scanf("%d", &n);
    printf("Nhap cac phan tu: ");
    for (int i = 0; i < n; i++)
        scanf("%d", &arr[i]);

    printf("So buoc nhay toi thieu: %d\n", min_steps(arr, n));
    return 0;
}

Kết quả đầu ra

Nhap kich thuoc mang: 7
Nhap cac phan tu: 2 1 1 5 2 1 1
So buoc nhay toi thieu: 3