在C ++中找到N从点N移动之后到达所有点的概率

假设我们有一个数字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
    猜你喜欢