2010年2月10日星期三

ICPC 4455 Suffix-Replacement Grammars

ICPC 4455 Suffix-Replacement Grammars

[World Finals 2009 - Problem K]

題意
現給定 N (<=100) 項規則,每項
形式為: XY(其中 XY 等長)
意義是:若字串的後綴為 X,則可花費用 1 ,將後綴替換成 Y

求由字串 S 轉換至 T 最短路*。(其中 ST 等長)

所有字串長度最多為 20。

[* 即 最小費用,使用 "最短路" 此詞是因為描術更直觀]



樣例

規則:
BC → CD
BC → CA
BCD → CCZ
A → C

S = BBA
T = CCZ

  BBA
→ BBC (應用 "A → C")
→ BCD (應用 "BC → CD")
→ CCZ (應用 "BCD → CCZ")

Answer: 3



題目分析
直接搜索明顯很容易超時
所以應該先分析將哪些字串納入考慮範圍(視為結點)
然後使用 BFS 或 最短路算法之類...

用上樣例作說明:
當對 "BBC" 應用 "BC → CA",我們得出 "BCA"
其實 "BCA" 是無所用

何解?

為了讓 "BCA" 進一步接近 T(即 "BCD")
我們必需進一步使用長度為 3 的轉換
可是 "BCA" 從沒出現在任何長度為3的變換

那就是說:若果 "BCA" 這後綴沒有在任何規則中出現
則 "BCA" 沒有希望能夠成為轉換過程中的 "踏腳石"



算法詳述
令 DP[LEN][X][Y] 為將字串 XY 的最短路。
其中 X, Y 長度均為 LEN

若存在規則 XY
則  DP[LEN][X][Y] = 1
否則 DP[LEN][X][Y] = Infinity

現對於每個固定的 LEN,應用 Floyd-Warshall 最短路算法。

另外:ABCDE→ABXYZ 的最短路
可以由
BCDE→BXYZ 或者
CDE→XYZ
的最短路直接更新

X[0]==Y[0] ,則有狀態轉移:
DP[LEN][X][Y] = min( DP[LEN][X][Y], DP[LEN-1][X.substr(1)][Y.substr(1)])

DP 順 LEN 由小至大更新
就可以逐步推移



核心算法
For LEN:=0 to S.length
  For (X,Y) s.t., X[0]==Y[0]
    DP[LEN][X][Y] = min( DP[LEN][X][Y], DP[LEN-1][X.substr(1)][Y.substr(1)] )
  EndFor
  For Rule: XY
    If X.length==LEN
      DP[LEN][X][Y] = 1
    EndIf
  EndFor
 Run Floyd-WarShall on DP[LEN]
EndFor

Return DP[S.length][S][T]



時間複雜度
我們只考慮所有出現在字串中的後綴

對於每個固定的 LEN (1 <= LEN <= 20),
最多有 202 個後綴。

所以時間複雜度最多是 O(20 * 200^3)



反直觀
答案可能超出 32-bit integer

沒有留言:

發佈留言