算法競(jìng)賽入門經(jīng)典(第2版)
定 價(jià):49.8 元
- 作者:劉汝佳
- 出版時(shí)間:2014/8/20
- ISBN:9787302356288
- 出 版 社:清華大學(xué)出版社
- 中圖法分類:TP301.6
- 頁(yè)碼:488
- 紙張:膠版紙
- 版次:2
- 開(kāi)本:16K
《算法競(jìng)賽入門經(jīng)典(第2版)》是一本算法競(jìng)賽的入門與提高教材,把C/C++語(yǔ)言、算法和解題有機(jī)地結(jié)合在一起,淡化理論,注重學(xué)習(xí)方法和實(shí)踐技巧。全書(shū)內(nèi)容分為12 章,包括程序設(shè)計(jì)入門、循環(huán)結(jié)構(gòu)程序設(shè)計(jì)、數(shù)組和字符串、函數(shù)和遞歸、C++與STL入門、數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)、暴力求解法、高效算法設(shè)計(jì)、動(dòng)態(tài)規(guī)劃初步、數(shù)學(xué)概念與方法、圖論模型與算法、高級(jí)專題等內(nèi)容,覆蓋了算法競(jìng)賽入門和提高所需的主要知識(shí)點(diǎn),并含有大量例題和習(xí)題。書(shū)中的代碼規(guī)范、簡(jiǎn)潔、易懂,不僅能幫助讀者理解算法原理,還能教會(huì)讀者很多實(shí)用的編程技巧;書(shū)中包含的各種開(kāi)發(fā)、測(cè)試和調(diào)試技巧也是傳統(tǒng)的語(yǔ)言、算法類書(shū)籍中難以見(jiàn)到的。
《算法競(jìng)賽入門經(jīng)典(第2版)》可作為全國(guó)青少年信息學(xué)奧林匹克聯(lián)賽(NOIP)復(fù)賽教材、全國(guó)青少年信息學(xué)奧林匹克競(jìng)賽(NOI)和ACM國(guó)際大學(xué)生程序設(shè)計(jì)競(jìng)賽(ACM/ICPC)的訓(xùn)練資料,也可作為IT工程師與科研人員的參考用書(shū)。
如果你是一名程序員,如果你參加NOIP、NOI、ACM/ICPC競(jìng)賽,只要你對(duì)算法感興趣,那就來(lái)吧!就是這本被最多程序員所喜愛(ài)、被大量學(xué)校廣泛作為教材的算法競(jìng)賽經(jīng)典之作!
算法競(jìng)賽入門經(jīng)典一書(shū)全新改版,頁(yè)碼翻倍,奇葩?非也,這是因?yàn)椋?/span>
◆第一版內(nèi)容太少,讓人感覺(jué)意猶未盡。
◆有些內(nèi)容有點(diǎn)過(guò)時(shí),需要與時(shí)俱進(jìn)。
◆C++的介紹太少,例題太少,學(xué)有余力的同學(xué)在入門完之后有些迷茫。
此次改版就是針對(duì)這些不足,所以很讓人期待!
第2版前言
《算法競(jìng)賽入門經(jīng)典》第1版出版至今已有四個(gè)年頭。這四年間發(fā)生了很多變化,如NOI系列比賽終于對(duì)STL“解禁”,如C11和C++11標(biāo)準(zhǔn)出臺(tái),g++編譯器升級(jí)(直接導(dǎo)致本書(shū)第1版中官方使用的?運(yùn)算符無(wú)法編譯通過(guò)),如《算法競(jìng)賽入門經(jīng)典——訓(xùn)練指南》的出版彌補(bǔ)了本書(shū)第1版的很多缺憾,再如ACM/ICPC的蓬勃發(fā)展,使更多的大學(xué)生了解并參與到了算法競(jìng)賽中來(lái)……
看來(lái),是時(shí)候給本書(shū)“升級(jí)”了。
主要的變化
我原本打算只是增加一章專門介紹C++和STL,用符合新語(yǔ)言規(guī)范的方式重寫(xiě)部分代碼,順便增加一些例題和習(xí)題,沒(méi)想到一寫(xiě)就是100頁(yè)——幾乎讓書(shū)的篇幅翻了一倍。寫(xiě)作第1版時(shí),220頁(yè)的篇幅是和諸位一線中學(xué)教師商量后定下來(lái)的,因?yàn)闀?shū)太厚會(huì)讓初學(xué)者望而生畏。不過(guò)這幾年的讀者反饋?zhàn)屛乙庾R(shí)到:由于篇幅限制,太多的東西讓讀者意猶未盡,還不如多寫(xiě)點(diǎn)。雖然之后出版了《算法競(jìng)賽入門經(jīng)典——訓(xùn)練指南》,但那本書(shū)的主要目標(biāo)是補(bǔ)充知識(shí)點(diǎn),即拓展知識(shí)寬度,而我更希望在知識(shí)寬度幾乎不變的情況下增加深度——我眼中的競(jìng)賽應(yīng)該主要比思維和實(shí)踐能力,而不是主要比見(jiàn)識(shí)。
索性,我繼續(xù)加大篇幅,用大量的例子(包括題目和代碼)來(lái)表現(xiàn)我想向讀者傳達(dá)的信息。一位試讀的朋友在收到第一份書(shū)稿片段時(shí)驚呼:“題目的質(zhì)量比第1版提高太多了!”這正是我這次改版的主要目的。
具體來(lái)說(shuō),這次改版有以下變化:
在前4章中逐步介紹一些更實(shí)用的語(yǔ)言技巧,直接使用競(jìng)賽題目作為例子。
全新的第5章,講解競(jìng)賽中最常用的C++語(yǔ)法,包括STL算法和容器。
第6~7章作為基礎(chǔ)篇,加大代碼和技巧的比例,并適當(dāng)增加例題。
第8~11章作為中級(jí)篇,增加了各種例題,著重鍛煉思維能力。
全新的第12章作為高級(jí)篇,在《算法競(jìng)賽入門經(jīng)典——訓(xùn)練指南》的基礎(chǔ)上補(bǔ)充少量知識(shí)點(diǎn)與大量精彩例題。
需要特別說(shuō)明的是第12章出現(xiàn)的原因。這一章的內(nèi)容很難,而且要求讀者熟練掌握《算法競(jìng)賽入門經(jīng)典——訓(xùn)練指南》的主要內(nèi)容,看起來(lái)和“入門”二字是矛盾的。其實(shí)本書(shū)雖然名為“入門經(jīng)典”,實(shí)際上卻不僅只適合入門讀者。根據(jù)這幾年讀者反饋的情況來(lái)看,有相當(dāng)數(shù)量的有經(jīng)驗(yàn)的選手也購(gòu)買了本書(shū)。原因在于:很多有經(jīng)驗(yàn)的選手屬于“自學(xué)成才”,總覺(jué)得自己可能會(huì)漏掉點(diǎn)什么基礎(chǔ)知識(shí)。事實(shí)也是如此:本書(shū)中提到的很多代碼和分析技巧是傳統(tǒng)教科書(shū)中見(jiàn)不到的,對(duì)于很多有經(jīng)驗(yàn)的選手來(lái)說(shuō)也是“新鮮事物”,并且他們能比初學(xué)者更快、更好地把這些知識(shí)運(yùn)用到比賽中去。本書(shū)第12章就是為這些讀者準(zhǔn)備的。如果這樣解釋還不夠直觀,就把第12章作為一個(gè)游戲里通關(guān)后多出來(lái)的Hard模式吧!
閱讀說(shuō)明
既然內(nèi)容有了較大變化,閱讀方式也需要再次說(shuō)明一下。首先,和本書(shū)第1版一樣,本書(shū)最好是有人帶著學(xué)習(xí),如老師、教練或者學(xué)長(zhǎng)。隨著網(wǎng)絡(luò)的發(fā)展,這個(gè)條件越來(lái)越容易滿足了——就算是沒(méi)人指導(dǎo),也可以在別人的博客中留言,或者在貼吧中尋求幫助。
一定要重視書(shū)中的“提示”。書(shū)中有很多“提示”部分都是非常重要的知識(shí)點(diǎn)或者技巧,有些提示看似平凡無(wú)奇,但如果沒(méi)有引起重視而導(dǎo)致賽場(chǎng)上丟分,可是會(huì)追悔莫及的。
接下來(lái)是關(guān)于新增第5章的。首先聲明一點(diǎn),這一章并不是C++語(yǔ)言速成——C++語(yǔ)言是不可能速成的。這一章不是說(shuō)你從頭讀到尾然后就掌握C++了,而是提供一個(gè)綱要,告訴你哪些東西是算法競(jìng)賽中最常用的,以及這些東西應(yīng)當(dāng)如何使用。你可以先另外找一本書(shū)(或者閱讀網(wǎng)上的文章)學(xué)習(xí)C++,然后再看本書(shū)第5章(目的是把那些又容易暈又不那么有用的知識(shí)從腦子里刪除),也可以直接看本書(shū)第5章,每次遇到看不懂或者覺(jué)得不夠詳細(xì)的地方,再找其他參考書(shū)來(lái)學(xué)。順便說(shuō)一句,就算你已經(jīng)非常熟悉C++了,也最好瀏覽一下第5章(特別是代碼。。這不會(huì)花費(fèi)太多時(shí)間,但很可能學(xué)到有用的東西。
忍不住再說(shuō)點(diǎn)題外話。有時(shí)學(xué)習(xí)算法的最好方法并不是編寫(xiě)程序,而是手算!笆炙恪边@個(gè)詞聽(tīng)上去有點(diǎn)枯燥,改成“玩游戲”如何?如《雷頓教授與不可思議的小鎮(zhèn)》就是一個(gè)不錯(cuò)的選擇——它包含了過(guò)河問(wèn)題(謎題7、93)、找砝碼(謎題6、131)、一筆畫(huà)(謎題30、39)、n皇后(謎題80~83,130)、倒水問(wèn)題(謎題23、24、78)、幻方(謎題95)、華容道(謎題97、132、135)等諸多經(jīng)典問(wèn)題。
致謝
雖然多出來(lái)了200多頁(yè),其實(shí)本書(shū)的改版工作并沒(méi)有花費(fèi)太長(zhǎng)時(shí)間(不到半年),在此期間也沒(méi)有麻煩太多朋友讀稿和討論。參與本書(shū)第2版讀稿和校對(duì)工作的幾位朋友分別是:陳鋒(第8~11章)、王玉斌(第8~9章,第12章)、郭云鏑(第12章)、曹海宇(第5章、第9章)、陳立杰(第12章)、葉子卿(第12章)、周以凡(第12章)。
感謝給我發(fā)郵件以及在googlecode的wiki中留言指出本書(shū)第1版勘誤的網(wǎng)友們:imxivid、zr95.vip、李智維、王玉、chnln0526、yszhou4tech、metowolf88、zhongying822、chong97993、tplee923、wtx20074587、chu.pang等,你們的支持和鼓勵(lì)是我寫(xiě)作的重要?jiǎng)恿Α?br />另外,書(shū)中部分難題的題解離不開(kāi)以下朋友的賜教和討論:Md.Mahbubul Hasan、Shahriar Manzoor、Derek Kisman、Per Austrin、Luis Garcia、顧昱洲、陳立杰、張培超等。
第2版的習(xí)題全部(這次不僅僅是“主要”了)來(lái)自UVa在線評(píng)測(cè)系統(tǒng),感謝Miguel Revilla教授、他的兒子Miguel Jr.和Carlos M. Casas Cuadrado對(duì)本書(shū)的大力支持。
最后,再次感謝清華大學(xué)出版社的朱英彪編輯在這個(gè)恰當(dāng)?shù)臅r(shí)機(jī)提出改版事宜,并容忍我把交稿時(shí)間一拖再拖。希望這次改版不會(huì)讓你失望。
劉汝佳
劉汝佳,1982年12月生,高中畢業(yè)于重慶市外國(guó)語(yǔ)學(xué)校。2000年3月獲得NOI2000全國(guó)青少年信息學(xué)奧林匹克競(jìng)賽一等獎(jiǎng)第四名,進(jìn)入國(guó)家集訓(xùn)隊(duì),并因此保送到清華大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)系。大一時(shí)獲2001年ACM/ICPC國(guó)際大學(xué)生程序設(shè)計(jì)競(jìng)賽亞洲-上海賽區(qū)冠軍和2002年世界總決賽銀牌(世界第四),2005年獲學(xué)士學(xué)位,2008年獲碩士學(xué)位。
學(xué)生時(shí)代曾為中國(guó)計(jì)算機(jī)學(xué)會(huì)NOI科學(xué)委員會(huì)學(xué)生委員,擔(dān)任IOI2002-2008中國(guó)國(guó)家隊(duì)教練,并為NOI系列比賽命題十余道,F(xiàn)為NOI競(jìng)賽委員會(huì)委員,并在NOI 25周年時(shí)獲得中國(guó)計(jì)算機(jī)學(xué)會(huì)頒發(fā)的“特別貢獻(xiàn)獎(jiǎng)”。
2004年至今共為ACM/ICPC亞洲賽區(qū)命題二十余道,擔(dān)任6次裁判和2次命題總監(jiān),并應(yīng)邀參加IOI和ACM/ICPC相關(guān)國(guó)際研討會(huì),發(fā)表論文兩篇。
2004年初作為第一作者出版專著《算法藝術(shù)與信息學(xué)競(jìng)賽》,2009年出版譯著《編程挑戰(zhàn)》,2009年出版《算法競(jìng)賽入門經(jīng)典》,2012年出版《算法競(jìng)賽入門經(jīng)典——訓(xùn)練指南》。
多年來(lái)在全國(guó)二十余個(gè)城市進(jìn)行中學(xué)生競(jìng)賽培訓(xùn)工作,為北京、上海、吉隆坡等地的著名高校授課與宣講,并多次與TopCoder、百度和網(wǎng)易有道等知名企業(yè)合作舉辦比賽,讓更多的IT人才獲得展示自我的平臺(tái)。
第1部分 語(yǔ)言篇
第1章 程序設(shè)計(jì)入門 1
1.1 算術(shù)表達(dá)式 1
1.2 變量及其輸入 3
1.3 順序結(jié)構(gòu)程序設(shè)計(jì) 6
1.4 分支結(jié)構(gòu)程序設(shè)計(jì) 9
1.5 注解與習(xí)題 13
1.5.1 C語(yǔ)言、C99、C11及其他 13
1.5.2 數(shù)據(jù)類型與輸入格式 14
1.5.3 習(xí)題 15
1.5.4 小結(jié) 16
第2章 循環(huán)結(jié)構(gòu)程序設(shè)計(jì) 18
2.1 for循環(huán) 18
2.2 while循環(huán)和do-while循環(huán) 22
2.3 循環(huán)的代價(jià) 25
2.4 算法競(jìng)賽中的輸入輸出框架 27
2.5 注解與習(xí)題 34
2.5.1 習(xí)題 34
2.5.2 小結(jié) 36
第3章 數(shù)組和字符串 37
3.1 數(shù)組 37
3.2 字符數(shù)組 41
3.3 競(jìng)賽題目選講 45
3.4 注解與習(xí)題 53
3.4.1 進(jìn)位制與整數(shù)表示 54
3.4.2 思考題 55
3.4.3 黑盒測(cè)試和在線評(píng)測(cè)系統(tǒng) 55
3.4.4 例題一覽與習(xí)題 56
3.4.5 小結(jié) 59
第4章 函數(shù)和遞歸 61
4.1 自定義函數(shù)和結(jié)構(gòu)體 61
4.2 函數(shù)調(diào)用與參數(shù)傳遞 65
4.2.1 形參與實(shí)參 65
4.2.2 調(diào)用棧 66
4.2.3 用指針作參數(shù) 69
4.2.4 初學(xué)者易犯的錯(cuò)誤 71
4.2.5 數(shù)組作為參數(shù)和返回值 71
4.2.6 把函數(shù)作為函數(shù)的參數(shù) 73
4.3 遞歸 74
4.3.1 遞歸定義 74
4.3.2 遞歸函數(shù) 75
4.3.3 C語(yǔ)言對(duì)遞歸的支持 75
4.3.4 段錯(cuò)誤與棧溢出 77
4.4 競(jìng)賽題目選講 79
4.5 注解與習(xí)題 92
4.5.1 頭文件、副作用及其他 93
4.5.2 例題一覽和習(xí)題 95
4.5.3 小結(jié) 99
第5章 C++與STL入門 100
5.1 從C到C++ 100
5.1.1 C++版框架 101
5.1.2 引用 102
5.1.3 字符串 103
5.1.4 再談結(jié)構(gòu)體 105
5.1.5 模板 106
5.2 STL初步 108
5.2.1 排序與檢索 108
5.2.2 不定長(zhǎng)數(shù)組:vector 109
5.2.3 集合:set 112
5.2.4 映射:map 113
5.2.5 棧、隊(duì)列與優(yōu)先隊(duì)列 115
5.2.6 測(cè)試STL 120
5.3 應(yīng)用:大整數(shù)類 123
5.3.1 大整數(shù)類BigInteger 124
5.3.2 四則運(yùn)算 125
5.3.3 比較運(yùn)算符 126
5.4 競(jìng)賽題目舉例 127
5.5 習(xí)題 134
第2部分 基礎(chǔ)篇
第6章 數(shù)據(jù)結(jié)構(gòu)基礎(chǔ) 139
6.1 再談棧和隊(duì)列 139
6.2 鏈表 143
6.3 樹(shù)和二叉樹(shù) 148
6.3.1 二叉樹(shù)的編號(hào) 148
6.3.2 二叉樹(shù)的層次遍歷 150
6.3.3 二叉樹(shù)的遞歸遍歷 155
6.3.4 非二叉樹(shù) 160
6.4 圖 162
6.4.1 用DFS求連通塊 162
6.4.2 用BFS求最短路 164
6.4.3 拓?fù)渑判?167
6.4.4 歐拉回路 168
6.5 競(jìng)賽題目選講 170
6.6 訓(xùn)練參考 175
第7章 暴力求解法 182
7.1 簡(jiǎn)單枚舉 182
7.2 枚舉排列 184
7.2.1 生成1~n的排列 184
7.2.2 生成可重集的排列 185
7.2.3 解答樹(shù) 186
7.2.4 下一個(gè)排列 187
7.3 子集生成 188
7.3.1 增量構(gòu)造法 188
7.3.2 位向量法 188
7.3.3 二進(jìn)制法 189
7.4 回溯法 191
7.4.1 八皇后問(wèn)題 191
7.4.2 其他應(yīng)用舉例 194
7.5 路徑尋找問(wèn)題 198
7.6 迭代加深搜索 206
7.7 競(jìng)賽題目選講 209
7.8 訓(xùn)練參考 213
第3部分 競(jìng)賽篇
第8章 高效算法設(shè)計(jì) 220
8.1 算法分析初步 220
8.1.1 漸進(jìn)時(shí)間復(fù)雜度 220
8.1.2 上界分析 222
8.1.3 分治法 223
8.1.4 正確對(duì)待算法分析結(jié)果 224
8.2 再談排序與檢索 225
8.2.1 歸并排序 225
8.2.2 快速排序 227
8.2.3 二分查找 227
8.3 遞歸與分治 229
8.4 貪心法 231
8.4.1 背包相關(guān)問(wèn)題 231
8.4.2 區(qū)間相關(guān)問(wèn)題 232
8.4.3 Huffman編碼 234
8.5 算法設(shè)計(jì)與優(yōu)化策略 235
8.6 競(jìng)賽題目選講 244
8.7 訓(xùn)練參考 252
第9章 動(dòng)態(tài)規(guī)劃初步 259
9.1 數(shù)字三角形 259
9.1.1 問(wèn)題描述與狀態(tài)定義 259
9.1.2 記憶化搜索與遞推 260
9.2 DAG上的動(dòng)態(tài)規(guī)劃 262
9.2.1 DAG模型 262
9.2.2 最長(zhǎng)路及其字典序 262
9.2.3 固定終點(diǎn)的最長(zhǎng)路和最短路 264
9.2.4 小結(jié)與應(yīng)用舉例 267
9.3 多階段決策問(wèn)題 270
9.3.1 多段圖的最短路 270
9.3.2 0-1背包問(wèn)題 271
9.4 更多經(jīng)典模型 274
9.4.1 線性結(jié)構(gòu)上的動(dòng)態(tài)規(guī)劃 274
9.4.2 樹(shù)上的動(dòng)態(tài)規(guī)劃 280
9.4.3 復(fù)雜狀態(tài)的動(dòng)態(tài)規(guī)劃 284
9.5 競(jìng)賽題目選講 290
9.6 訓(xùn)練參考 303
第10章 數(shù)學(xué)概念與方法 310
10.1 數(shù)論初步 310
10.1.1 歐幾里德算法和唯一分解定理 310
10.1.2 Eratosthenes篩法 312
10.1.3 擴(kuò)展歐幾里德算法 313
10.1.4 同余與模算術(shù) 314
10.1.5 應(yīng)用舉例 316
10.2 計(jì)數(shù)與概率基礎(chǔ) 318
10.2.1 楊輝三角與二項(xiàng)式定理 319
10.2.2 數(shù)論中的計(jì)數(shù)問(wèn)題 321
10.2.3 編碼與解碼 323
10.2.4 離散概率初步 324
10.3 其他數(shù)學(xué)專題 327
10.3.1 遞推 327
10.3.2 數(shù)學(xué)期望 332
10.3.3 連續(xù)概率 334
10.4 競(jìng)賽題目選講 336
10.5 訓(xùn)練參考 341
第11章 圖論模型與算法 352
11.1 再談樹(shù) 352
11.1.1 無(wú)根樹(shù)轉(zhuǎn)有根樹(shù) 352
11.1.2 表達(dá)式樹(shù) 353
11.2 最小生成樹(shù) 355
11.2.1 Kruskal算法 356
11.2.2 競(jìng)賽題目選解 358
11.3 最短路問(wèn)題 359
11.3.1 Dijkstra算法 359
11.3.2 Bellman-Ford算法 363
11.3.3 Floyd算法 364
11.3.4 競(jìng)賽題目選講 365
11.4 網(wǎng)絡(luò)流初步 366
11.4.1 最大流問(wèn)題 366
11.4.2 增廣路算法 367
11.4.3 最小割最大流定理 369
11.4.4 最小費(fèi)用最大流問(wèn)題 370
11.4.5 應(yīng)用舉例 372
11.5 競(jìng)賽題目選講 375
11.6 訓(xùn)練參考 379
11.7 總結(jié)與展望 384
第12章 高級(jí)專題 386
12.1 知識(shí)點(diǎn)選講 386
12.1.1 自動(dòng)機(jī) 386
12.1.2 樹(shù)的經(jīng)典問(wèn)題和方法 392
12.1.3 可持久化數(shù)據(jù)結(jié)構(gòu) 397
12.1.4 多邊形的布爾運(yùn)算 399
12.2 難題選解 404
12.2.1 數(shù)據(jù)結(jié)構(gòu) 404
12.2.2 網(wǎng)絡(luò)流 409
12.2.3 數(shù)學(xué) 411
12.2.4 幾何 415
12.2.5 非完美算法 419
12.2.6 雜題選講 423
12.3 小結(jié)與習(xí)題 446
附錄A 開(kāi)發(fā)環(huán)境與方法 455
A.1 命令行 455
A.1.1 文件系統(tǒng) 455
A.1.2 進(jìn)程 456
A.1.3 程序的執(zhí)行 456
A.1.4 重定向和管道 457
A.1.5 常見(jiàn)命令 457
A.2 操作系統(tǒng)腳本編程入門 458
A.2.1 Windows下的批處理 458
A.2.2 Linux下的Bash腳本 459
A.2.3 再談隨機(jī)數(shù) 460
A.3 編譯器和調(diào)試器 460
A.3.1 gcc的安裝和測(cè)試 460
A.3.2 常見(jiàn)編譯選項(xiàng) 461
A.3.3 gdb簡(jiǎn)介 462
A.3.4 gdb的高級(jí)功能 463
A.4 淺談IDE 464
主要參考書(shū)目 465