首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

BNU 25359 Escape Time II:狀態壓縮 DP 求最大寶石收集

     編輯:C++ 入門

BNU 25359 Escape Time II:狀態壓縮 DP 求最大寶石收集

房間數 n ≤ 10,逃生時間 t ≤ 1e6。每個房間有寶石,從起點 s 出發,必須在 t 秒內到達終點 e,求能收集的最大寶石數。若無法按時到達輸出 0。

狀態定義

dp[mask][i] 表示已訪問房間集合為 mask、當前位於房間 i 所需的最短時間。狀態數 2^n * n ≤ 10240,極小。

轉移邏輯

  • 初始:dp[1<,其餘設為 INF。
  • DFS/BFS 擴展:從狀態 (mask, i) 嘗試走向未訪問的鄰居 j,新時間 nt = dp[mask][i] + dist[i][j]。若 nt ≤ t 且 nt < dp[mask|1<,則更新並繼續搜索。
  • 答案:遍歷所有 mask,若 dp[mask][e] ≤ t,計算該 mask 對應的寶石總和,取最大值。

關鍵優化

  • 圖中保留最短邊(多邊取最小權)。
  • 剪枝:時間超限直接返回。
  • 用 long long 存寶石數與時間,防溢出。

複雜度

  • 時間:O(2^n * n^2) ≈ 1e6 操作,極快。
  • 空間:O(2^n * n)。

狀態壓縮 DP 是小規模圖中帶約束路徑問題的利器,本題結合時間限制與收益最大化,屬於經典模板題。

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