Giả sử chúng ta có một số N, nó đại diện cho vị trí ban đầu của người đó trên trục số. Ta cũng có L là xác suất người đó đi bên trái. Chúng ta phải tìm xác suất để đạt được tất cả các điểm trên trục số sau khi hoàn thành N lần di chuyển từ điểm N. Mỗi lần di chuyển có thể sang trái hoặc sang phải.
Vì vậy, nếu đầu vào là n =2, l =0,5, thì đầu ra sẽ là [0,25, 0, 0,5, 0, 0,25]
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
cao:=1 - thấp
-
Xác định một mảng A có kích thước:n + 1 x 2 * n + 1 và điền bằng 0
-
A [1, n + 1] =cao, A [1, n - 1] =thấp
-
để khởi tạo i:=2, khi i <=n, cập nhật (tăng i lên 1), thực hiện -
-
để khởi tạo j:=1, khi j - =2 * n, cập nhật (tăng j lên 1), thực hiện -
-
A [i, j]:=A [i, j] + (A [i - 1, j - 1] * cao)
-
-
để khởi tạo j:=2 * n - 1, khi j> =0, cập nhật (giảm j đi 1), thực hiện -
-
A [i, j]:=A [i, j] + (A [i - 1, j + 1] * thấp)
-
-
-
để khởi tạo i:=0, khi i - 2 * n + 1, cập nhật (tăng i lên 1), thực hiện -
-
hiển thị A [n, i]
-
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#include <bits/stdc++.h> using namespace std; void find_prob(int n, double low) { double high = 1 - low; double A[n + 1][2 * n + 1] = {{0}}; A[1][n + 1] = high; A[1][n - 1] = low; for (int i = 2; i <= n; i++) { for (int j = 1; j <= 2 * n; j++) A[i][j] += (A[i - 1][j - 1] * high); for (int j = 2 * n - 1; j >= 0; j--) A[i][j] += (A[i - 1][j + 1] * low); } for (int i = 0; i < 2*n+1; i++) cout << A[n][i] << endl; } int main() { int n = 2; double low = 0.6; find_prob(n, low); }
Đầu vào
2, 0.6
Đầu ra
0.36 0 0.48 0 0.16