原创 10.3其他數學專題

10.3.1遞推 漢諾塔問題。 分析: 當n稍微大一點時,手工移動就開始變得困難起來,下面直接給出遞歸解法:首先,把前n-1個圓盤放到C軸;接下來把n號圓盤放到C軸;接下來把n號圓盤放到B軸;最後,再把前n-1個盤子放到B軸。 斐波那契

原创 7.2枚舉排列

7.2.1 生成1~n的排列 void print_permutation(int n,int* A,int cur){ if(cur==n){ for(int i=0;i<n;i++) p

原创 10.1數論初步

10.1.1歐幾里得算法和唯一分解定理 除法表達式 分析: 表達式的值一定可以寫成A/B的形式:A是其中一些Xi的乘積,而B是其他數的乘積,而B是其他數的乘積。不難發現,X2必須放在分母位置,那其他數呢? 其他數均可以放在分子位置 接下來

原创 倒水問題

分析: 假設在某一時刻,第1個杯子中有V0升水,第二個杯子有V1升水,第三個杯子有V2升水,稱當時的系統狀態爲(V0,V1,V2),可畫出狀態圖 注意!本題目標是倒的水量最少,而不是步數最少 因此需要改進一下算法,不是每次取步數最少的結點

原创 9.3多階段決策問題

每做一次決策就可以得到解得一部分,當做完所有決策做完之後,完整的解就浮出水面了。在回溯法中,每次決策對應給一個結點產生新的子樹,而解的生成過程對應一顆解答樹,結點的層數就是“下個待填充位置”cur 9.3.1多段圖的最短路 多段圖是一種特

原创 10.2計數與概率基礎

排列與組合是最基本的計數技巧。本節介紹一些基本的相關知識和方法 加法原理。做一件事有n個辦法,第i個辦法有pi種方案 乘法原理。做一件事情有n個步驟 容斥原理。(概率論求和的公示) 有重複元素的全排列。有k個元素,其中有k個元素,其中第

原创 8.2再談排序與檢索

8.2.1歸併排序 第一種高效排序算法是歸併排序,按照分治三步法,對歸併排序算法介紹如下 劃分問題:把序列分成元素個數儘量相等的兩半 遞歸求解:把兩半元素分別排序 合併問題:把兩個有序表合併成一個 void merge_sort(int*

原创 7.3子集生成

給定一個集合,枚舉所有可能的子集,本節討論的集合中沒有重複元素 7.3.1 增量構造法 第一種思路一次選出一個元素放到集合中 #include<stdio.h> #include<cstring> using namespace std;

原创 DAG上的動態規劃

有向無環圖上的動態規劃是學習動態規劃的基礎,很多問題都可以轉化爲DAG上的最長路,最短路或路徑計數問題 9.2.1DAG模型 嵌套矩形問題 分析: 矩形之間的可嵌套關係是一個典型的二元關係,二元關係可以用圖來建模,如果矩形X可以嵌套在矩形

原创 7.6迭代加深搜索

迭代加深搜索是一個應用範圍很廣的算法,不僅可以像回溯發那樣找一個解,也可以像狀態空間搜索那樣找一條路徑 誒及分數問題 分析: 解決方案是採用迭代加深搜索,從小到大枚舉深度上限maxd,每次執行只考慮深度不超過maxd的結點。此過程中還可以

原创 11.1再談樹

有n個頂點的樹具有以下3個特點:連通,不含圈,恰好包含n-1條邊,有意思的是,具備上述3個特點中的任意兩個,就可以推出第三個 11.1.1無根樹轉有根樹 分析: 鄰接矩陣佔用的空間很大,用vector數組即可。由於n個結點的樹,只有n-1

原创 寒假學習之優先隊列

優先隊列是一種抽象的數據 優先隊列定義在頭文件中, Priority_queuepq. Pq是個“越小整數優先級越低的優先隊列” 由於出隊元素並不是最先進隊的元素,出隊方法有front(),變爲top() 自定義優先隊列 可

原创 9.1數字三角形

9.1.1問題描述與狀態定義 回溯法過於麻煩,爲了得到高效的算法,需要用抽象的方法思考問題:把當前的位置(i,j)看出一個狀態,然後定義狀態(i,j)的指標函數d(i,j)爲從格子(i,j)發出時能得到的最大和(包括格子(i,j)本身的值

原创 8.4貪心法

8.4.1 揹包相關問題 最優裝載問題,給出N個物體,第I個物體重量爲Wi,選擇儘量多,使得總重量不超過C; 分析: 從大到小排序即可 部分揹包問題。有n個物體,第i個物體的重量爲wi,價值爲vi。總重量不超過C的情況下讓總價值儘量高

原创 9.4更多經典模型

9.4.1線性結構上的動態規劃 最長上升子序列問題 分析: 設d(i)爲以i結尾的最長上升子序列的長度,則d(i)=max{0,d(j)}+1;最終答案是max{d(i)} 最長公共子序列問題 分析: 設d(i,j)爲A1,A2,,,A