內容介紹
本書每章為一個主題,實驗內容安排緊扣大學算法和數學的教學,用程式設計競賽中的算法和數學試題作為實驗試題,將算法和數學的教學與程式設計競賽的解題訓練結合在一起;在思維方式和解題策略的訓練方面,以問題驅動和啟發式引導為主要方式,培養讀者通過編程解決問題的能力。本書特點:
書中給出的234道試題全部精選自ACM國際大學生程式設計競賽的世界總決賽以及各大洲賽區現場賽和網路預賽、大學程式設計競賽、線上比賽和其他諸如IOI等程式設計競賽題目,時間跨度為1989年到2010年,這些試題均能通過線上提交的方式進行實時檢驗,從而方便讀者進行實驗和練習。
本書提供了官方的原版試題、測試數據和解答程式作為參考,讀者可以通過對官方的測試數據的分析,了解測試數據的特點和常見陷阱,在以後的編程中提高解題質量和正確性。
各章的實驗範例可以用於大學算法課程的教學與實驗,在此基礎上使用題庫進行解題,還可以輔導學生進行程式設計競賽的專項訓練。
本書提供了試題的英文原版描述和大部分試題的測試數據,讀者可登錄華章網站(http://www.hzbook.com)下載。
作品目錄
前言第1章 求解Ad Hoc類問題的編程實驗1
1.1 機理分析法的實驗範例1
1.2 統計分析法的實驗範例5
1.3 相關題庫10
第2章 模擬法的編程實驗35
2.1 直敘式模擬的實驗範例36
2.2 篩選法模擬的實驗範例44
2.3 構造法模擬的實驗範例51
2.4 相關題庫55
第3章 數論的編程實驗69
3.1 素數運算的實驗範例69
3.1.1 使用篩法生成素數的實驗範例69
3.1.2 測試大素數的實驗範例76
3.2 求解不定方程和同餘方程的實驗範例81
3.2.1 計算最大公約數和不定方程81
3.2.2 計算同餘方程和同餘方程組85
3.3 積性函式的實驗範例91
3.3.1 使用歐拉函式φ(n)計算與n互質的正整數個數 92
3.3.2 使用莫比烏斯函式μ(n)計算非平方數n的質因子個數97
3.4 相關題庫102
第4章 組合分析的編程實驗118
4.1 生成排列組合的實驗範例118
4.1.1 按字典序思想生成下一排列組合118
4.1.2 按字典序思想生成所有的排列組合121
4.2 排列組合計數的實驗範例122
4.2.1 一般的排列組合計數公式123
4.2.2 兩種特殊的排列組合計數公式126
4.3 容斥原理與抽屜原理的實驗範例132
4.3.1 利用抽屜原理求解存在性問題132
4.3.2 利用容斥原理對並集計數134
4.4 波利亞定理的實驗範例140
4.4.1 波利亞定理的概念基礎141
4.4.2 利用波利亞定理計算集合在置換群作用下產生的等價類個數148
4.5 相關題庫157
第5章 貪心法的編程實驗165
5.1 體驗貪心法內涵的實驗範例165
5.2 利用數據有序化進行貪心選擇的實驗範例172
5.3 在綜合性的P類問題中使用貪心法的實驗範例181
5.4 相關題庫187
第6章 動態規劃(DP)方法的編程實驗197
6.1 線性DP的實驗範例198
6.1.1 初步體驗線性DP問題198
6.1.2 子集和問題202
6.1.3 最長公共子序列問題203
6.1.4 最長遞增子序列問題206
6.2 樹形DP的實驗範例213
6.3 狀態壓縮DP的實驗範例218
6.4 單調最佳化1D/1D DP的實驗範例224
6.4.1 經典模型1:利用決策代價函式w的單調性最佳化224
6.4.2 經典模型2:利用決策區間下界的單調性最佳化228
6.4.3 經典模型3:利用最優決策點的凸性最佳化233
6.5 相關題庫236
第7章 高級數據結構的編程實驗273
7.1 後綴數組的實驗範例273
7.1.1 使用倍增算法計算名次數組和後綴數組273
7.1.2 計算最長公共前綴276
7.1.3 後綴數組的套用278
7.2 線段樹的實驗範例288
7.2.1 線段樹的基本概念和基本操作288
7.2.2 線段樹單點更新的維護290
7.2.3 線段樹子區間更新的維護293
7.3 處理特殊圖的實驗範例306
7.3.1 計算歐拉圖306
7.3.2 計算哈密爾頓圖314
7.3.3 計算最大獨立集324
7.3.4 計算割點、橋和雙連通分支327
7.4 相關題庫336
第8章 計算幾何的編程實驗354
8.1 點線面運算的實驗範例354
8.1.1 計算點積和叉積354
8.1.2 計算線段交361
8.1.3 利用歐拉公式計算多面體371
8.2 利用掃描線算法計算矩形的面積並375
8.2.1 沿垂直方向計算矩形的面積並375
8.2.2 沿水平方向計算矩形的面積並380
8.3 計算半平面交的實驗範例383
8.3.1 計算半平面交的在線上算法384
8.3.2 利用極角計算半平面交的算法390
8.4 計算凸包和旋轉卡殼的實驗範例398
8.4.1 計算凸包399
8.4.2 旋轉卡殼實驗403
8.5 相關題庫408