目 錄
第1章 計算機問題求解概述\t1
1.1 問題與問題實例\t1
1.2 計算機問題求解周期\t2
1.3 算法與程序\t5
1.4算法復雜性分析\t5
1.4.1空間復雜性\t6
1.4.2 時間復雜性\t7
習題1\t15
第2章 程序設計語言與數據結構\t16
2.1 程序設計語言的“盲點”\t16
2.1.1 long不夠長\t17
2.1.2 double不夠準\t19
2.1.3 遞歸不夠快\t25
2.2 基本數據結構\t26
2.2.1 線性表\t26
2.2.2 棧和隊列\t30
2.2.3 樹和二叉樹\t36
2.2.4 優先隊列和堆\t44
2.2.5 圖\t45
2.2.6 並查集\t47
2.3 標準模板庫\t49
2.3.1 模板的基本概念\t49
2.3.2 標準模板庫概述\t51
2.3.3 標準模板庫應用\t52
習題2\t63
第3章 枚舉算法\t69
3.1 枚舉的基本思想\t69
3.2 模糊數字\t70
3.3 真假銀幣\t72
3.4 m錢n雞\t75
3.5 數字配對\t77
3.6 繩子切割\t79
3.7 石頭距離\t81
習題3\t84
第4章 遞歸與分治\t90
4.1 遞歸程序\t90
4.2 分治法的基本原理\t94
4.3 合並排序\t96
4.4 逆序對問題\t100
4.5 快速排序\t102
4.6 最接近點對問題\t106
4.7 指數運算\t111
4.8 二分查找\t113
習題4\t114
第5章 動態規劃\t122
5.1 動態規劃的基本思想\t122
5.1.1 動態規劃的基本要素\t124
5.1.2 動態規劃的求解步驟\t125
5.2 矩陣連乘\t126
5.3 最優二叉搜索樹\t131
5.4 多段圖最短路徑\t136
5.5 最長公共子序列\t140
5.6 0-1背包問題\t143
5.7 最大上升子序列\t146
習題5\t149
第6章 貪心算法\t155
6.1 貪心算法的基本要素\t155
6.2 活動安排問題\t157
6.3 小數背包問題\t161
6.4 最優前綴碼\t164
6.5 單源最短路徑\t169
6.6 最小生成樹\t174
6.6.1 Prim算法\t175
6.6.2 Kruskal算法\t178
習題6\t182
第7章 搜索技術\t187
7.1 問題的狀態空間表示\t187
7.2 深度優先搜索\t189
7.3 廣度優先搜索\t191
7.4 回溯算法\t193
7.4.1 回溯算法的基本原理和框架程序\t193
7.4.2 裝載問題的回溯算法\t199
7.4.3 圓排列問題\t203
7.5 分支限界\t206
7.5.1 分支限界法的基本原理\t206
7.5.2 裝載問題的分支限界法\t208
7.6 啟發式搜索\t211
7.6.1 啟發式搜索基本原理\t211
7.6.2 裝載問題的啟發式搜索\t215
習題7\t217
附錄A 復雜度分析的數學基礎\t225
附錄B 常用C語言和STL函數\t235
附錄C 程序設計競賽和OnlineJudge介紹\t241
附錄D 教學資源\t244
參考文獻\t245