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

HDU 3861:Prison Break - 狀態壓縮 DP + BFS + 二分答案

     編輯:關於C++

問題描述

機器人初始能量 x,在地圖中移動(上下左右),每步消耗 1 能量。G 點可充滿能量,Y 點需全部走遍。牆 D 不可通行。求最小初始能量 x 使能走完所有 Y。G+Y ≤ 15,地圖 ≤ 15×15。

解法框架

  1. 關鍵點提取:將 F(起點)、所有 Y、所有 G 作為關鍵點,編號 0..K-1 (K ≤ 16)。
  2. BFS 預計算距離:對每個關鍵點 BFS,得到兩兩間最短路徑長 dist[i][j]。若不可達則標記 -1。
  3. 狀態壓縮 DP:dp[mask][i] = 走過關鍵點集合 mask,當前在點 i,剩餘能量的最大值。初始 dp[1<。
    • 轉移:從 i 走到未訪問的 j,需 dist[i][j] ≤ 當前能量。新能量 = 當前能量 - dist[i][j];若 j 是 G 則充滿 = x。
    • 目標:存在 mask 包含所有 Y 且 dp[mask][*] ≥ 0。
  4. 二分答案:x ∈ [1, 225] (最大步數 15×15),二分最小可行 x。

代碼關鍵邏輯

bool check(int x) {
    memset(dp, -1, sizeof(dp));
    dp[1<= 0) {
            if ((mask & allY) == allY) return true; // 所有 Y 已訪問
            for (int j = 0; j < K; ++j) if (!(mask & (1<

複雜度

  • BFS:K * O(n*m) ≤ 16 * 225。
  • DP 狀態數:2^K * K ≤ 65536 * 16 ≈ 1e6。
  • 二分 log(225) ≈ 8 次,總計 ~8e6 操作,極快。

總結

經典「關鍵點 + 狀態壓縮 DP + 二分」模式。關鍵點較少 (≤15) 時狀態壓縮可行,BFS 求實際最短路,二分將決策問題轉化為可行性判定。

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