在 C++ 中查找从点 N 开始经过 N 步后到达所有点的概率


假设我们有一个数字 N,它表示一个人在数轴上的初始位置。我们还有 L,它是这个人向左移动的概率。我们必须找到在从点 N 开始完成 N 步移动后到达数轴上所有点的概率。每次移动都可以向左或向右。

因此,如果输入类似于 n = 2,l = 0.5,则输出将为 [0.25, 0, 0.5, 0, 0.25]

为了解决这个问题,我们将遵循以下步骤:

  • high := 1 - low

  • 定义一个大小为 n+1 x 2*n+1 的数组 A,并将其填充为 0

  • A[1, n + 1] = high,A[1, n - 1] = low

  • 初始化 i := 2,当 i <= n 时,更新(i 增加 1),执行:

    • 初始化 j := 1,当 j −= 2 * n 时,更新(j 增加 1),执行:

      • A[i, j] := A[i, j] + (A[i - 1, j - 1] * high)

    • 初始化 j := 2 * n - 1,当 j >= 0 时,更新(j 减少 1),执行:

      • A[i, j] := A[i, j] + (A[i - 1, j + 1] * low)

  • 初始化 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

更新于: 2020-08-27

85 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告