Computer >> Máy Tính >  >> Lập trình >> C ++

Tìm xác suất đạt được tất cả các điểm sau khi N di chuyển từ điểm N trong C ++


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