在 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
廣告
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP