n 人排隊等電梯。每秒:隊首的人以概率 p 進入電梯,概率 1-p 留在原地。t 秒後,電梯裡期望有多少人?
`dp[i][j]` = 第 i 秒結束時,電梯裡有 j 人的概率。
初始:`dp[0][0] = 1`。
轉移:
`E = Σ j * dp[t][j]` (j=1..min(n,t))
#include
#include
using namespace std;
double dp[2005][2005];
int main() {
int n, t; double p;
while (scanf("%d%lf%d", &n, &p, &t) == 3) {
for (int i = 0; i <= t; i++)
for (int j = 0; j <= n; j++)
dp[i][j] = 0;
dp[0][0] = 1;
for (int i = 1; i <= t; i++) {
for (int j = 0; j <= n; j++) {
if (j > 0) dp[i][j] += dp[i-1][j-1] * p;
if (j < n) dp[i][j] += dp[i-1][j] * (1 - p);
else dp[i][j] += dp[i-1][j]; // j==n 已滿
}
}
double ans = 0;
for (int j = 1; j <= n; j++) ans += j * dp[t][j];
printf("%.7f\n", ans);
}
return 0;
}
只依賴上一行,可用 `dp[2][2005]` 交替,空間優化至 O(n)。