Re: [問題] ACM 11084 11127 (TLE)

看板Prob_Solve (計算數學 Problem Solving)作者 ( )時間13年前 (2011/09/03 11:02), 編輯推噓2(200)
留言2則, 1人參與, 最新討論串2/2 (看更多)
試了一下,純 O(|s|!)枚舉仍然會TLE,就換了個方式枚舉可過 想法是,如果我們用輸入的一部分湊出了餘數r,那必須用輸入的另一部分 湊出餘數 d-r. 所以說,我們把輸入拆分成前 |s|/2 個和後 |s|/2 個分別排列,使得排列 的花費降為 (|s|/2)! 之後,再把兩邊分別組合起來;為了方便,我們先枚舉 前 |s|/2 個字所要佔用的位置,這樣後 |s|/2 可以用的位置就確定了. 枚舉位置+排列後,對前後分別記下算出餘數r(0≦r<d),然後算出被d整除 的方式 枚舉位置的花費則是 C(n,n/2),極限測資C(10,5)≦252;所以這樣做時間 複雜度為 O( C(n,n/2)[d+(n/2)!] )... 傳上去是跑 0.120s 舉個例子, s=12345, d=2, 前半取 2 個, 後半取 3 個 12 21 餘0的有12000,21000共兩個 餘1的0個 345 354 435 453 534 543 餘0的354,534兩個 餘1的345,435,453,543共四個 所以位子這樣分配時,mod d餘零的共 2*2 + 0*4 = 4個 1 2 2 1 餘0的有10200,20100共兩個 餘1的零個 3 45 3 54 4 35 4 53 5 34 5 43 餘0的有3054,5034兩個 餘1的3045,4035,4053,5043共4個 ...剩下類推 附上寫得爛爛的程式碼 http://pastie.org/2474232 我想這樣做在這題能跑這麼快是因為d不會全部都是10,000... 而這種題目讓人很想狀態壓縮 DP (狀態:[哪些用了哪些還沒][餘數]) ,不過枚舉能過就算了... ※ 引述《singlovesong (~"~)》之銘言: : 題目: : 11084 http://luckycat.kshs.kh.edu.tw/homework/q11084.htm : Code: : 11084: http://codepad.org/c7XwSbg4 : 這兩題都沒有什麼特別的想法 直接暴搜 : 果然都TLE : 想請問這兩題該用什麼解法才可以不超時的呢? : 上網google 了好一陣子都沒什麼結果... : code寫的很醜 只希望強者能指點一下算法^^" -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.217.33.236 ※ 編輯: suhorng 來自: 61.217.33.236 (09/03 11:03)

09/03 11:33, , 1F
先謝謝在看! 那請問另外一題呢..>"<
09/03 11:33, 1F

09/03 11:44, , 2F
可以多解釋一下dp 的recursive formula 要怎麼做嗎?
09/03 11:44, 2F
文章代碼(AID): #1EOPYtLP (Prob_Solve)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1EOPYtLP (Prob_Solve)