演算法初級之窮竭搜尋

2021-10-04 22:05:40 字數 1372 閱讀 7245

窮竭搜尋:將所有可能性羅列出來,在其中總能找到乙個答案。

1.1遞迴

n!=n*(n-1)!

1.2 棧 後進先出

1.3 佇列 先進先出

1.4 深度優先搜尋dfs:

從某個狀態開始,不斷轉移狀態直到無法轉移後回退一步,繼續轉移到其他狀態,不斷重複,知道找到最終解。(eg:解數獨)

遞迴:問:給定整數a1、a2、…、an,判斷是否可以從中選出若干數,使它們的和恰好為k。限制條件:-1≤n≤20 -10°≤a≤10 -108≤k≤108

思路:從a開始按順序決定每個數加或不加,在全部個數都決定後再判斷它們的和是不是k即可。因為狀態數是2,所以複雜度是o(2)。

int a[max n]

int n, k:

已經從前i項得到了和sum,然後對於i項之後的進行分支

bool dfs(int i, int sum)(

/如果前n項都計算過了,則返回sum是否與k相等

f(i ==n) return sum==ki;

/不加上ai]的情況

if(dfs(i + 1, sum)) return true;

//加上a[i]的情況

if (dfs(i+1, sum +a[i])) return true;

//無論是否加上a[i]都不能湊成k就返回 false

return false;

void solve(

if (dfs(0, 0))printf("yes\n");

else printf("no\n");

1.6 寬度優先搜尋(bfs)

它與深度優先搜尋類似,從某個狀態出發探索所有可以到達的狀態。

與深度優先搜尋的不同之處在於搜尋的順序,寬度優先搜尋總是先搜尋距離初始狀態近的狀態。因此複雜度為o(狀態數×轉移的方式)。

**typedef為c語言的關鍵字,作用是為一種資料型別定義乙個新名字。這裡的資料型別包括內部資料型別(int,char等)和自定義的資料型別(struct等)。 在程式設計中使用typedef目的一般有兩個,乙個是給變數乙個易記且意義明確的新名字,另乙個是簡化一些比較複雜的型別宣告。

**pair是將2個資料組合成乙個資料,當需要這樣的需求時就可以使用pair,如stl中的map就是將key和value放在一起來儲存。另乙個應用是,當乙個函式需要返回2個資料的時候,可以選擇pair。 pair的實現是乙個結構體,主要的兩個成員變數是first second 因為是使用struct不是class,所以可以直接使用pair的成員變數。

1.7 剪枝

由於窮竭搜尋會將所有可能解都檢查一遍,當姐空間非常大時候,複雜度也會相對應提高,股深度優先搜尋時,有時早已明確從當前狀態怎麼轉移都不存在解,這時候不再搜尋,而是直接跳過。此方法稱為剪枝。

(七)窮竭搜尋

遞迴函式 再次呼叫自身的行為成為遞迴 應用與斐波那契數列 棧實現一種lifo能力,具備push和pop功能 c 裡面已經含有這種函式 佇列實現一種fifo能力,具備push和pop功能 c 裡面已經含有這種函式 深度優先搜尋 dfs 思想 從某個狀態開始,不斷轉移狀態,直至無法轉移,然後回退前一步,...

POJ 2718 窮竭搜尋

給一串大於0且小於9的數字,將其分成兩串數字且差值最小。長度大於0的數字不能以0開始。兩個子串長度相同或相差1時它們的差值最小。使用next permutation生成全排列後,用前一半的數字減後一半的數字取絕對值。include include include include define max...

AOJ 0525 窮竭搜尋

題意 傳送門 aoj 0525 題意即翻轉部分行或列,使得最終為 0 或 1 的煎餅數目最大。列數 1 c 10 000 列舉會翻車,行數 1 r 10 可以直接列舉 01 狀態,按列增加 0 或 1 的煎餅數最大值,之後更新答案即可。include include include include ...