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

HDU 4628 Pieces:狀壓 DP 枚舉回文子集 + 分層 BFS 求最少步數

     編輯:C++ 入門

問題

字符串長度 ≤ 16。每步可刪除一個**回文子序列** (不要求連續)。求刪空整個串的最少步數。

狀壓 DP 思路

狀態 mask (0~2^n-1) 表示已刪除的字符集合。目標從 0 到達 full = (1<。每步可增加一個回文子集。預處理所有回文子集 pal[],然後 BFS 分層擴展。

預處理回文子集

bool isPal(int mask) {
    string t;
    for (int i=0;i>i&1) t += s[i];
    for (int i=0,j=t.size()-1;i pal;
for (int mask=1; mask<1<

分層 BFS (比 DP 更快)

vector cur{0}, nxt;
vector vis(1<

優化細節

  • n=16 時 pal 最大 ~幾千,BFS 狀態數 ≤ 2^16=65536,極快。
  • 避免 memset 大數組導致 TLE,用 vector 或靜態數組 + 時間戳。
  • 多測試用例時,每個 case 重新初始化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved