acm週中學習總結

2021-09-19 04:32:11 字數 2577 閱讀 2248

這週新開了搜尋演算法的學習,到目前為止,初步接觸了一些搜尋的題目和用法。

繼續感悟

搜尋是一種利用列舉和遞迴尋找目標的演算法。核心是對路徑的列舉和遞迴操作(遞迴是搜尋的基礎)。搜尋分為廣度優先搜尋(bfs)和深度優先搜尋(dfs),廣度優先搜尋就是逐層列舉,逐層查詢,這一層不列舉完不進行下一層。而深度優先搜尋則是一條道走到黑,先到n-1節點的下一層節點的第乙個,如果不是目標,則回溯,對於n-1節點在向下便利,就像乙個固執的人,總是一條道走到黑。

個人感覺搜尋的模板並沒有太大用處,模板是用來領悟思考的。具體的題目要具體分析,關鍵是要有搜尋這個思想,搜尋是萬能演算法,當沒有什麼好的辦法時,可以考慮搜尋。其實也就是遞迴列舉,只不過有具體的指導思路罷了。

上一節區間dp在演算法競賽中是比較簡單的演算法,我卻覺得難度較大,其實還是沒有入門,缺乏足夠的思考精力吧。還是覺得做題不夠,總是沒有思路。自己選擇了這條路,那就必須做到頂尖。加油。

理解一種演算法一定不能只關注固定模板,更關鍵的是分析。

先總結遞迴的知識吧:

抽象的語言總結遞迴:程式直接或間接呼叫自身的程式設計技巧稱為遞迴演算法(recursion)。

直接或間接呼叫自身的函式稱為遞迴函式

它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解。

把乙個不能或不好解決的大問題轉化為乙個或幾個小問題,再把這些小問題進一步分解成更小的小問題,

最小問題可以直接解決

解決步驟:

遞迴演算法解題通常有三個步驟:

1)分析問題、尋找遞迴:找出大規模問題與小規模問題的關係,這樣通過遞迴使問題的規模逐漸變小。

2)設定邊界、控制遞迴:找出停止條件,即演算法可解的最小規模問題。

經典例題:

歐幾里得演算法

集合的全排列問題

半數集問題

整數分解問題

總結搜尋的知識點:

搜尋是有目的的列舉:

搜尋演算法是利用計算機的高效能來有目的地窮舉乙個問題的部分或所有的可能情況,從而求出問題的解的一種方法。

相比於單純的列舉演算法有了一定的方向性和目標性。演算法是在解的空間裡,從乙個狀態轉移(按照要求拓展)到其他狀態,這樣進行下去,將解的空間中的狀態遍歷,找到答案(目標的狀態)。

類似於動態規劃,搜尋的狀態與狀態之間也是互相聯絡的。

演算法之間的聯絡也是值得體會的!!

while not queue.empty ()

begin

可加結束條件

tmp = queue.top ()

從tmp迴圈拓展下乙個狀態next

if 狀態next合法 then

begin

生成新狀態next

next.step = tmp.step + 1

queue.pushback (next)

endqueue.pop ()

end

深度優先搜尋

遞迴實現:

function dfs (int step, 當前狀態)

begin

可加結束條件

從當前狀態迴圈拓展下乙個狀態next

if 狀態next合法 then

dfs (step + 1, next ))

end

非遞迴實現:

while not stack.empty ()

begin

tmp = stack.top()

從tmp拓展下乙個未拓展的狀態next

if 沒有未拓展狀態(到達葉節點) then

stack.pop()

else if 狀態next合法 then

stack.push(next)

end

經典例題:

素數環:從1到20這20個數擺成乙個環,要求相鄰的兩個數的和是乙個素數。

【演算法分析】

非常明顯,這是一道回溯的題目。從1開始,每個空位有20種可能,只要填進去的數合法:與前面的數不相同;與左邊相鄰的數的和是乙個素數。第20個數還要判斷和第1個數的和是否素數。

【演算法流程】

1、資料初始化; 2、遞迴填數:判斷第i個數填入是否合法;

a、如果合法:填數;判斷是否到達目標(20個已填完):是,列印結果;不是,遞迴填下乙個;

b、如果不合法:選擇下一種可能;

#include#include#include#includeusing namespace std;

bool b[21]=;

int total=0,a[21]=;

int search(int); //回溯過程

int print(); //輸出方案

bool pd(int,int); //判斷素數

int main()

acm 週中學習總結

初步接觸動態規劃,確確實實感受到了動態規劃的不死板而且靈活的尋找最優思路的精妙,簡單來說 動態規劃就是通過拆分問題,定義問題狀態和狀態之間的關係,使得問題能夠以遞推 或者說分治 的方式去解決。動態規劃的本質,是對問題狀態的定義和狀態轉移方程的定義。前面剛剛接觸貪心演算法,在很多情況下,用貪心策略可以...

acm週中學習總結

當下最重要的還是做好下一步計畫,平衡好時間。不管是usaco的題目還是別的oj上的題目,還是慢下來,思考明白。要把思考作為第一要義,思考清楚之後,寫 只是水到渠成的結果。演算法要及其熟,基本的板子要非常熟。本週圖論最短路徑演算法和最小生成樹演算法,以前只是聽過,現在學過才發現如此有趣,能夠解決很多問...

2019 10 9週中學習總結

感悟 把乙個知識搞明白,搞透徹,需要長期的思考,對問題思路的積累同樣需要長期的思考。所以,長期的思考相當重要!而對知識和 的熟練運用也需要長久的訓練。關於專業的課程,深入下來都是很精妙的,像是資料結構的課程,我以前對於stl裡的資料結構封裝掌握的雖然不是太好 因為常用的只有vector,map,se...