在 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 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.