在演算法競賽中,對於求解方案數或情況數的時候有什麼固定的思維方法或解題策略嗎?

時間 2021-05-31 15:55:29

1樓:

方案計數,俗稱數數題。主要考察選手對資料之間潛在聯絡的觀察能力。

有跡可循的思維模式如下:

低階:找規律(字面意義)

中階:XJBDP(從樹上、區間DP到狀壓、輪廓線DP,還有一些常見DP優化,包括優化狀態、優化轉移、FFT加速、資料結構加速。一般來說資料規模越小越是前者,規模大起來一般是套路)

高階:《炫酷反演魔術》(vfk某PPT,內容豐富,介紹了二項式反演、莫比烏斯反演、子集反演並一定程度上揭示了本質)

天階:找規律(經常有dalao找規律水過驚天DP題)

2樓:rsa

解題沒有固定的方法,不過「套路」還是有不少的。

組合計數問題,通常可以從列舉法出發,考慮優化。優化的方法有很多,如加法/乘法原理、排列組合等,如動態規劃(記憶化搜尋),如補集轉化、交換求和次序、修改DP順序等技巧。

個人認為組合計數最重要的是要有正確的確定計數物件的順序

比如統計乙個字串的回文子串行個數時,如果枚舉子序列的左半邊然後統計右邊有多少子串行,那麼統計右邊需要知道左邊整個子串行,也就是左邊都要列舉,效率太低,而如果是先確定第1個和第n個字元位置(n是子串行長),然後確定第2個和第n-1個字元位置……那麼每次只要關心這兩個位置相同並且在上次兩個位置之間就可以了,DP複雜度就降下來了。

比如第一題,列舉所有合法括號序列,再列舉所有子區間:

for each legal bracket series X:

for each i = 0,1,2,...,n-|Sif X(i,i+|S|]=S: ans += 1

這種多層的列舉可以考慮交換求和次序。交換兩個for,先列舉所有子區間,再列舉所有合法括號序列:

for each i = 0,1,2,...,n-|S|:

for each legal bracket series Xif X(i,i+|S|]=S: ans += 1

因為S是合法括號序列,所以X合法的條件等價於X(0,i]X(i+|S|,n]合法。於是該過程等價於外層迴圈n-|S|+1次,內層統計長度為n-|S|的括號序列。答案就是長度為n-|S|的括號序列個數乘n-|S|+1。

比如第二題,可以列舉每個位置是否選取。要用什麼順序呢?不妨從上到下從左到右。

假如已經列舉了前i-1行以及第i行的前j格,那麼已確定的部分,與之後的列舉相關的部分只有第i行的前j格、第i-1行的後m-j格每個格仔往上直到牆是否存在守衛,以及第i行第j格往左直到牆是否存在守衛,以及M是否已經用過。這樣就可以設計出O(nm*2^m)的狀壓DP了。

資訊學競賽中學的演算法有多少在真正的程式設計中會用到 頻率如何?

OFFLINE 工作中經常用到樹形結構吧.不過倒是沒怎麼用到演算法.感覺是空間思維問題,不是演算法問題.例如要實現乙個System.Linq.IQueryProvider就挺難的. hcahsror 說幾個我寫資料庫的時候用到的 歸併排序,在記憶體有限的情況下對大資料進行排序的時候,需要分成有序頁然...

hash tree 在apriori 演算法中是如何進行支援度計數的?

穆皚青 這本書看到這裡也非常困擾然後來網上搜尋,得到這個帖子。所以是先有了這15個3 項集,然後根據規則分到了對應的位置,具體的規則就是上面鏈結裡提到的mod3還有乙個根下面超過3要繼續分 所以我還是不明白這15項是哪兒來的,尤其譬如123根本沒有包括在裡面 stone jack HASH演算法的目...

在資訊學競賽中AC WA RE CE TLE MLE PE OLE分別是什麼意思?

王厚薄就是王厚博 AC 正確的答案 WA 錯誤答案 PC 部分正確 RE 執行時錯誤 CE 編譯錯誤 TLE 時間超過限制 MLE 記憶體超過限制 OLE 輸出超過限制 ILE 輸入超過限制 UKE 未知錯誤 PE 格式錯誤 JF Judged失敗 看我看我,絕對最全! yizr cnyali AC...