Luggage Lock 偏移,bfs,预处理(2021.11.沈阳)
生活随笔
收集整理的這篇文章主要介紹了
Luggage Lock 偏移,bfs,预处理(2021.11.沈阳)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意 :
- 要從a0a1a2a3a_0a_1a_2a_3a0?a1?a2?a3?變化到b0b1b2b3b_0b_1b_2b_3b0?b1?b2?b3?,求最小操作次數,每次操作可以選擇一個區(qū)間[l,r][l,r][l,r],使得?l≤i≤r,ai=(ai+/?1)mod10\forall l\leq i \leq r,a_i = (a_i +/- 1) mod 10?l≤i≤r,ai?=(ai?+/?1)mod10
思路 :
- 首先考慮暴力的做法,從a0a1a2a3a_0a_1a_2a_3a0?a1?a2?a3?bfs,直到走到b0b1b2b3b_0b_1b_2b_3b0?b1?b2?b3?跳出,轉移時采用記憶化,總共的狀態(tài)數是10410^4104,即每次求出一組樣例最壞復雜度為10410^4104,總的就是10910^9109,無法通過
- 因此我們考慮預處理,但預處理出每一種狀態(tài)到其他每種狀態(tài)的最小步數是10810^8108,不一定能過
- 因此我們考慮預處理0000到其他狀態(tài)的最小步數,從a0a1a2a3a_0a_1a_2a_3a0?a1?a2?a3?到b0b1b2b3b_0b_1b_2b_3b0?b1?b2?b3?相當于從0000到c0c1c2c3c_0c_1c_2c_3c0?c1?c2?c3?,做偏移處理
- 每次操作,相當于一次區(qū)間修改,從0000到0110就是對[1,2][1,2][1,2]這個區(qū)間整體加1,每次操作,都可以選擇10個區(qū)間 :[0,0],[0,1],[0,2],[0,3],[1,1],[1,2],[1,3],[2,2],[2,3],[3,3][0,0],[0,1],[0,2],[0,3],[1,1],[1,2],[1,3],[2,2],[2,3],[3,3][0,0],[0,1],[0,2],[0,3],[1,1],[1,2],[1,3],[2,2],[2,3],[3,3],對每個區(qū)間,都有兩種撥碼方法(向上或向下?lián)芤桓?#xff09;
- 所以,每個狀態(tài)a0a1a2a3a_0a_1a_2a_3a0?a1?a2?a3?進行一次操作可以轉換成另外20個數字
- 將0000到9999看作10510^5105個結點,每個結點有20個邊,每個邊的長度是1,那么,從0000轉換為c0c1c2c3c_0c_1c_2c_3c0?c1?c2?c3?的最少步驟,就等于這個無向圖上0000到c0c1c2c3c_0c_1c_2c_3c0?c1?c2?c3?的最短路徑
總結
以上是生活随笔為你收集整理的Luggage Lock 偏移,bfs,预处理(2021.11.沈阳)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ATM and Students 双指针
- 下一篇: 同余(数论) AcWing算法课