假设我们有一个数字N,它代表人在数字线上的初始位置。我们也有L,这是该人离开的可能性。我们必须找到从点N开始完成N次移动后到达数字线上所有点的概率。每次移动都可以向左或向右。
因此,如果输入像n = 2,l = 0.5,那么输出将是[0.25,0,0.5,0,0.25]
为了解决这个问题,我们将遵循以下步骤-
高:= 1-低
定义大小为n + 1 x 2 * n + 1的数组A并用0填充
A [1,n + 1] =高,A [1,n-1] =低
对于初始化i:= 2,当i <= n时,更新(将i增加1),执行-
A [i,j]:= A [i,j] +(A [i-1,j + 1] *低)
A [i,j]:= A [i,j] +(A [i-1,j-1] *高)
对于初始化j:= 1,当j − = 2 * n时,更新(将j增加1),-
对于初始化j:= 2 * n-1,当j> = 0时,更新(将j减1),-
对于初始化i:= 0,当i − 2 * n + 1时,更新(i增加1),-
显示A [n,i]
让我们看下面的实现以更好地理解-
#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); }
2, 0.6
输出结果
0.36 0 0.48 0 0.16