首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

魚塘決鬥存活機率:動態規劃狀態壓縮解法

     編輯:程式設計綜合問答

問題:n 條魚 (n≤18),每天隨機兩條決鬥,失敗者死亡,給定勝率矩陣 p[i][j],求 n-1 天后每條魚成為唯一倖存者的機率。

狀態壓縮 DP 思路

  • 狀態 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,符合限制。

優化技巧

  1. 預計算每個 mask 的存活魚列表與數量。
  2. 只枚舉 u < v,避免重複。
  3. 使用 float 或 double,最終 printf("%.5f") 四捨五入。

C++ 核心框架

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 是解決小規模集合隨機過程機率問題的利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved