問題:n 條魚 (n≤18),每天隨機兩條決鬥,失敗者死亡,給定勝率矩陣 p[i][j],求 n-1 天后每條魚成為唯一倖存者的機率。
mask (bitmask) 表示當前存活魚群,共 2^n 狀態 (n=18 時 262,144,可行)。dp[mask][i]:在 mask 存活集合下,魚 i 最終倖存機率。dp[1<。mask 中任兩條魚 u, v 決鬥,機率 1 / C(cnt,2),更新 dp[mask ^ (1< 等。 dp[(1<。 2^n,每狀態枚舉配對 O(n²),總 O(n²·2^n) ≈ 18²·26萬 ≈ 8.4×10⁷,C++ 1 秒內可過。double dp[1<<18][18] ≈ 36 MB,符合限制。mask 的存活魚列表與數量。u < v,避免重複。float 或 double,最終 printf("%.5f") 四捨五入。int n; double p[18][18];
double dp[1<<18][18];
vector fish[1<<18];
int cnt[1<<18];
int main() {
cin >> n;
for (int i=0;i> p[i][j];
int ALL = (1<>i & 1) fish[mask].push_back(i);
}
for (int i=0;i
狀態壓縮 DP 是解決小規模集合隨機過程機率問題的利器。