Cho một mảng các số dương. Mỗi phần tử đại diện cho số lượng nhảy tối đa có thể thực hiện từ chỉ số đó để đến cuối mảng. Mục tiêu là tìm số lượng cách nhảy từ phần tử đó để đến cuối mảng. Nếu arr[] là [1,2,3] thì đối với 1 có thể nhảy 1, đối với 2 có thể nhảy 1 hoặc 2 và đối với 3 có thể nhảy 1, 2 hoặc 3.
Ví dụ
Đầu vào
arr[] = {1,2,3}
Đầu ra
Số cách nhảy để đến cuối mảng là: 1 1 0
Giải thích
Đối với 1, các nhảy: 1. Đối với 2, các nhảy 1 hoặc 2, để đến cuối chỉ cần một nhảy 1. Đối với 3, các nhảy 1,2 hoặc 3, vì ở cuối không cần nhảy.
Đầu vào
arr[] = {4,3,6,2}
Đầu ra
Số cách nhảy để đến cuối mảng là: 4 2 1 0
Giải thích
Đối với 4, các nhảy: 1, 2, 3 hoặc 4. Để đến cuối cần 1,2 hoặc 3. Các cách: 4-3-6-2, 4-6-2, 4-2, 4-3-2. Tổng 4. Đối với 3, nhảy 1, 2 hoặc 3 để đến cuối cần cả hai. Cách: 3-6-2, 3-2. Tổng 2. Đối với 6, nhảy 1 đến 5, đến cuối cần 1. Cách: 6-2. Tổng 1. Đối với 2, nhảy 1 hoặc 2, vì ở cuối không cần nhảy.
Phương pháp sử dụng
Trong phương pháp này, đối với mỗi phần tử arr[i] chúng ta sẽ cộng số cách đến cuối mảng cho tất cả các phần tử phía trước arr[i] và có thể đến được từ phần tử hiện tại. Cộng thêm 1 vào số cách này cho arr[i] nếu chúng ta có thể trực tiếp đến cuối từ arr[i] trong một nhảy duy nhất.
- Nhận mảng nguyên
arr[]. - Hàm
reach_end(int arr[], int size)nhận mảng và trả về số cách nhảy để đến cuối. - Tạo mảng
arr_2[]để lưu số cách đến cuối từ mỗi phần tử củaarr[]. - Khởi tạo toàn bộ
arr_2[]bằng 0 sử dụngmemset(arr_2, 0, sizeof(arr_2)). - Duyệt
arr[]bằng vòng lặp for từi=size-2đếni=0, vì phần tử cuối cùng sẽ không được xem xét. - Lấy
temp = size - i - 1. Nếutemp >= arr[i]thì chúng ta có thể trực tiếp đến cuối bằng một nhảy. Tăng số cách choarr[i]bằngarr_2[i]++. - Bây giờ đối với tất cả các phần tử khác có thể đến cuối và mà chúng ta có thể đến từ
arr[i], cộng số cách vàoarr_2[i]. - Để làm điều trên, duyệt bằng vòng lặp for từ
j=i+1đếnj<size-1vàj<=arr[i]+i. Nếu bất kỳarr[j]không phải -1, cộng nó vàoarr_2[i]. - Nếu
arr_2[i]vẫn là 0 thì đặt nó thành -1, có nghĩa là không thể đến cuối. - Cuối cùng của tất cả vòng lặp, chúng ta sẽ có
arr_2[]chứa số cách đến cuối cho mỗi phần tử củaarr[]. - In
arr_2bằng vòng lặp for làm kết quả.
Ví dụ mã
#include <bits/stdc++.h>
using namespace std;
void reach_end(int arr[], int size) {
int arr_2[size];
memset(arr_2, 0, sizeof(arr_2));
for (int i = size-2; i >= 0; i--) {
int temp = size - i - 1;
if (arr[i] >= temp) {
arr_2[i]++;
}
for (int j = i+1; j < size-1 && j <= arr[i] + i; j++) {
if (arr_2[j] != -1) {
arr_2[i] = arr_2[i] + arr_2[j];
}
}
if (arr_2[i] == 0) {
arr_2[i] = -1;
}
}
cout << "Số cách nhảy để đến cuối mảng là: ";
for (int i=0; i < size; i++) {
cout << arr_2[i] << " ";
}
}
int main() {
int arr[] = {2, 3, 7, 1, 8, 9};
int size = sizeof(arr) / sizeof(arr[0]);
reach_end(arr, size);
return 0;
}
Đầu ra
Nếu chạy mã trên, sẽ tạo ra đầu ra sau:
Số cách nhảy để đến cuối mảng là: 8 5 3 1 1 0