九度OJ小結2

2022-02-17 21:34:51 字數 4088 閱讀 2949

由於安排問題,距離上次小結時間已經過去很久。導致這次小結的內容很多。

本次小結涉及到主要內容如下所示:

1. 最小生成樹問題

對於最小生成樹問題一般有兩種求解方法:分別為prime演算法和kruskal演算法。

prime演算法:

int prime(int

cur)

for(int i = 1; i < m; i ++)

}visit[index] = true

; sum +=mincost;

for(int j = 0; j < m; j ++)

}

} return

sum;

}

kruskal演算法:

#include #include 

#include

#include

#include

#define max_size 1010

using

namespace

std;

intn, m;

inttree[max_size];

int findroot(int x)

}int

main()

int ans = 0

;

for(int i = 1 ; i <= n ; i++)

printf(

"%d\n

",ans-1

); }

return0;

}

2. 最短路徑問題對於最短路徑問題一般使用兩種演算法floyd演算法和floyd演算法:

void

floyd()

}

}

}

}

dijkstra演算法

void dijkstra(int s)   //

s是起點

intindex;

for(int i = 1; i < n; i ++)

}visit[index] = true

;

for(int j = 0; j < n; j ++)

} }}

最小生成樹和最短路徑的詳細講解以及演算法實現**見:3. 有向無環圖問題拓撲排序操作:

首先,所有有入度(即以該結點為弧頭的弧的個數)的結點不可能排在第乙個。那麼,我們選擇乙個入度為 0 的結點,作為序列的第乙個結點。當該結點被選為序列的第乙個頂點後,我們將該點從圖中刪去,同時刪去以該結點為弧尾的所有邊,得到乙個新圖。

那麼這個新圖的拓撲序列即為原圖的拓撲序列中除去第乙個結點後剩餘的序列。同樣的,我們在新圖上選擇乙個入度為0的結點,將其作為原圖的第二個結點,並在新圖中刪去該點以及以該點為弧尾的邊。這樣我們就得到了乙個新圖,重複同樣的方法,直到所有的結點和邊都從原圖中刪去。

若在所有結點尚未被刪去時即出現了找不到入度為0的結點的情況,則說明剩餘的結點形成乙個環路,拓撲排序失敗,原圖不存在拓撲序列。

4. 廣度優先搜尋bfs

使用佇列的先進先出特性,對每一條路徑組成的樹進行全部遍歷。bfs,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜尋整張圖,直到找到結果為止。因此bfs適用於求解最優問題,而下面的深度優先搜尋則適用於尋找問題是否有解。

5. 深度優先搜尋dfs

深度優先遍歷圖的方法是,從圖中某頂點v出發:

(1)訪問頂點v;

(2)依次從v的未被訪問的鄰接點出發,對圖進行dfs;直至圖中和v有路徑相通的頂點都被訪問;

(3)若此時圖中尚有頂點未被訪問,則從乙個未被訪問的頂點出發,重新進行dfs,直到圖中所有頂點均被訪問過為止。

6. 遞迴問題

遞迴演算法是把問題轉化為規模縮小了的同類問題的子問題。然後遞迴呼叫函式來表示問題的解。乙個函式直接或間接呼叫自己本身,這種函式叫遞迴函式,其中若區分函式和過程則上述的函式均可替換為過程。遞迴就是程式自己呼叫自己( recursion)

一般來說,遞迴需要有邊界條件、遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。 

遞迴演算法所體現的「重複」一般有三個要求:

1. 每次呼叫在規模上都有所縮小(通常是減半);

2. 相鄰兩次重複之間有緊密的聯絡,前一次要為後一次做準備(通常前一次的輸出就作為後一次的輸入);

3. 在問題的規模極小時必須用直接給出解答而不再進行遞迴呼叫,因而每次遞迴呼叫都是有條件的(以規模未達到直接解答的大小為條件),無條件遞迴呼叫將會成為死迴圈而不能正常結束。

7. 回溯法

回溯法(探索與回溯法)是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。

若用回溯法求問題的所有解時,要回溯到根,且根結點的所有可行的子樹都要已被搜尋遍才結束。

而若使用回溯法求任乙個解時,只要搜尋到問題的乙個解就可以結束。

8. 最長遞增子串行問題

常見的dp問題.

9. 最長公共公子序列問題

10. 動態規劃問題

推薦部落格:

11. 揹包問題

揹包九講:

0-1揹包修改版:

0-1揹包再修改版:

多重揹包:

12. 字串操作

string轉為char陣列,str.c_str()

string中的替換:str.replace(startpos,replacelegth,insertstr);

string中的查詢:str.find(findsrtr,startpos) (返回值為第一次出現的下標)

string中的擦除:

(1)erase(pos,n); 刪除從pos開始的n個字元,比如erase(0,1)就是刪除第乙個字元(2)erase(position);刪除position處的乙個字元(position是個string型別的迭代器)(3)erase(first,last);刪除從first到last之間的字元(first和last都是迭代器)其他操作轉部落格:

九度Oj題解

一 動態規劃專題 1205 n階樓梯上樓問題 dp i 表示到達i階的方法數,狀態轉移方程 dp i dp i 1 dp i 2 值很大要用long long.1451 不容易系列之一 dp i 表示總共i個數時的錯排方案數,狀態轉移方程 dp i i 1 dp i 1 i 2 dp i 2 142...

九度OJ 時鐘

輸入 輸入包含多組測試資料,每組測試資料由乙個按hh mm表示的時刻組成。輸出 對於每組測試資料,輸出乙個浮點數,代表時針和分針的夾角 劣弧對應的角 用角度表示,結果保留兩位小數。樣例輸入 03 00 14 45 樣例輸出 90.00 172.50 arc.cpp created on 2014年1...

九度OJ 題目1018

題目1018 統計同成績學生人數 題目描述 讀入n名學生的成績,將獲得某一給定分數的學生人數輸出。輸入 測試輸入包含若干測試用例,每個測試用例的格式為 第1行 n 第2行 n名學生的成績,相鄰兩數字用乙個空格間隔。第3行 給定分數 當讀到n 0時輸入結束。其中n不超過1000,成績分數為 包含 0到...