1st
Google code jam Qualification Round 2018 Saving The Universe Again [暴力法]: 對S所有排序可能情況逐一檢查,保留合法者,並回傳最小的交換次數。 假設P 'length = L 且 C有K個。 Complexity = C(L, K) (所有排列情況)* L = L*L!/((K!) * (L-K)!) ,指數成長。 雖然可以先從 C(L, K)過濾掉不可能的情況,但加速有限。 [遞迴公式] 設 m(P, D) 為字串P限制D下的最佳解。 假設沒有S則m(P,D) = 0; 否則設第一個S的位置為T,P = CCC..CSP'。 則遞迴公式為: m(P, D) = min ( T + m(P', D - 1)), T - 1 + m(P', D/2) , T - 2 + m (P', D/4 - 1) ... (m(P'', D/(2^T) - 1))). 範例: m(CSCSS, 3) = min( 1(用來swap C S CSS) + m(CCSS, 2) , m(SCSS, 1(=3>>1)) ) 其中 m(SCSS, 1)不可能。 遞迴的求 1 + m(CCSS, 2) = 1 + min( (2 + m(CCS, 1)), m(CSS, 1)) 其中 m(CSS, 1)不可能。 故再次遞迴 opt = 1 + 2 + m(CCS, 1) = 1 + 2 + 2 = 5 [bottom up] [Time Complexity]: