(預設剪枝:1. 不會走回上一步 2. 走過的狀態用 map 紀錄並維護最小值,如果超過就 return)
經過實測之後發現 n ≤ 13 而且所有答案都 ≤ 36
直接把遞迴深度上限設定成 36 然後暴力跑就過了 1,2,3,5
再加上一個剪枝:如果「目前的 s」跟 t 有共同前綴或後綴 (當然,如果遇到 0 就要結束),那下一次移動時一定不會往那邊移動。
所以就維護一個共同不含 0 的前後綴長度,每次轉移的時候就不能走到那裡
for (limL = 0; s[limL] == t[limL] and s[limL] != '0'; ++limL);
for (limR = sz-1; s[limR] == t[limR] and s[limR] != '0'; --limR);
在 dfs 的時候也跟著維護左右界
int rollbackL = limL, rollbackR = limR;
for (; s[limL] == t[limL] and s[limL] != '0'; ++limL);
for (; s[limR] == t[limR] and s[limR] != '0'; --limR);
// do some dfs
limL = rollbackL, limR = rollbackR;
這樣可以直接讓第四筆從 TLE 直接變成 35ms www
附上我的 AC code
我不知道它看起來會這樣 QuQ
(預設剪枝:1. 不會走回上一步 2. 走過的狀態用 map 紀錄並維護最小值,如果超過就 return)
經過實測之後發現 n ≤ 13 而且所有答案都 ≤ 36
直接把遞迴深度上限設定成 36 然後暴力跑就過了 1,2,3,5
再加上一個剪枝:如果「目前的 s」跟 t 有共同前綴或後綴 (當然,如果遇到 0 就要結束),那下一次移動時一定不會往那邊移動。
所以就維護一個共同不含 0 的前後綴長度,每次轉移的時候就不能走到那裡
for (limL = 0; s[limL] == t[limL] and s[limL] != '0'; ++limL);
for (limR = sz-1; s[limR] == t[limR] and s[limR] != '0'; --limR);
在 dfs 的時候也跟著維護左右界
int rollbackL = limL, rollbackR = limR;
for (; s[limL] == t[limL] and s[limL] != '0'; ++limL);
for (; s[limR] == t[limR] and s[limR] != '0'; --limR);
// do some dfs
limL = rollbackL, limR = rollbackR;
這樣可以直接讓第四筆從 TLE 直接變成 35ms www
附上我的 AC code
我不知道它看起來會這樣 QuQ
(預設剪枝:1. 不會走回上一步 2. 走過的狀態用 map 紀錄並維護最小值,如果超過就 return)
經過實測之後發現 n ≤ 13 而且所有答案都 ≤ 36
直接把遞迴深度上限設定成 36 然後暴力跑就過了 1,2,3,5
再加上一個剪枝:如果「目前的 s」跟 t 有共同前綴或後綴 (當然,如果遇到 0 就要結束),那下一次移動時一定不會往那邊移動。
所以就維護一個共同不含 0 的前後綴長度,每次轉移的時候就不能走到那裡
for (limL = 0; s[limL] == t[limL] and s[limL] != '0'; ++limL);
for (limR = sz-1; s[limR] == t[limR] and s[limR] != '0'; --limR);
在 dfs 的時候也跟著維護左右界
int rollbackL = limL, rollbackR = limR;
for (; s[limL] == t[limL] and s[limL] != '0'; ++limL);
for (; s[limR] == t[limR] and s[limR] != '0'; --limR);
// do some dfs
limL = rollbackL, limR = rollbackR;
這樣可以直接讓第四筆從 TLE 直接變成 35ms www
附上我的 AC code
這題是給高一的state space search 練習題,基本上時限都調高了一點,用BFS加上避免重複拜訪節點就可以達成,未來也會出一些題目需要用到 heuristic function 才能達成。
本網站還在建置當中,未來會再新增題目,也會公布給所有花中的學生知道,歡迎所有花中在校或是已畢業的優秀學長們給所有的學弟們建議與引導。