在 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
广告