Re: [問題] ACM Trainsorting

看板C_and_CPP作者 (dqipb)時間12年前 (2011/08/24 11:33), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/4 (看更多)
不好意思我懶得看他的說明了,直接照我理解的講一次。題目敘述是這樣的(複製的): 把車廂依重量由大到小排列,車廂以事先排定的順序抵達車站。當一截車廂抵 達時,可以依重量把它接在列車的前方或後方或不要這截車廂。列車越長越 好,但車廂要依重量排列。最後算出接出的最長火車是多長? 假設最佳解的最佳序列是 a_1, a_2, ..., a_n,且設其中最早加入序列的車是 a_m, 那我們知道排在 a_m 以後的車子(如果有的話)a_{m+1}, a_{m+2}, ..., a_n 必定 都比 a_m 還晚加入(而且越後面越晚加入) 排在 a_m 以前的子(如果有) a_1, a_2, ..., a_{m-1} 也一定比 a_m 還晚加入序列 (這次是越前面的越晚加入。) 好,接下來看序列 a_m, a_{m+1}, a_{m+2}, ..., a_n,顯然它們最長的可能就是以 a_m 開頭的 LDS(要包含 a_m),對所有的 1≦m≦n 可以在總共 O(n lg n) 的時間求出 然後看序列 a_m, a_{m-1}, a_{m-2}, ..., a_1(就是 a_m 前面的序列翻轉過來,因為 這樣凸顯出加入順序),很明顯它也是以 a_m 開頭的 LIS(也要包含 a_m)。同樣,也 可以對所有 1≦m≦n 在總共 O(n lg n) 的時間內求出。 於是假若某個 a_m 在最佳解中的話,那最佳解長度就是 LIS(m)+LDS(m)-1。因為以 a_m 起頭的 LIS、LDS 絕對不會有重複的數字(除了a_m)。但我們並不知道哪個 a_m 在最佳 解當中,於是就枚舉 1≦m≦n,這樣總時間複雜度是 O(nlgn + nlgn + n) = O(n lg n) 至於為什麼要從尾巴算?因為你要求出的是「以每個a_m起頭的LIS、LDS」各是多少。從 頭算的話算出來的不是你要的東西。 ※ 引述《k577887 (HaHa-Dog)》之銘言: : 問題(Question): : 這一題為什要從後面看過來算LIS 跟LDS : 為什從第一個算會錯誤... : http://ppt.cc/s3cm : 討論地方 1 2 4 3 7 6 : 從第一個算起 7 6 3 2 1 怎來的.... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.115.144.193 ※ 編輯: dqIpb 來自: 59.115.144.193 (08/24 11:38)
文章代碼(AID): #1EL73kRO (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1EL73kRO (C_and_CPP)