『壹』 dp是什麼意思 深入解析dp演算法的含義與應用
(1)圖像處理:動態規劃可以用來識別圖像中的物體,比如人臉識別、指紋識別等。
(3)金融風險管理:動態規劃可咐搜局以用來進行投資組合優化、風險評估等任務。
3. 動態規劃的實現步驟
(1)定義狀態:將大問題分解成若干個子問題,定義每個子問題的狀態。
動態規劃,英文全稱Dynamic Programming,是一種演算法思想,也是一種數學優化方法。它的主要思想是將一個大問題分解成若干個小問題,從而簡化問題的求解漏豎過程。動態規劃演算法在計算機科學、數學、物理、生物學等領域都有廣泛的應用。
(3)確定初始狀態:確衡讓定最小規模的子問題的解。
『貳』 ACM進階指南
大一上學期:
必學:
1.C語言基礎語法必須全部學會
a)推薦「語言入門」分類20道題以上
b)提前完成C語言課程設計
2.簡單數學題(推薦「數學」分類20道以上)
需要掌握以下基本演算法:
a)歐幾里德演算法求最大公約數
b)篩法求素數
c)康托展開
d)逆康托展開
e)同餘定理
f)次方求模
3.計算幾何初步
a)三角形面積
b)三點順序
4.學會簡單計算程序的時間復雜度與空間復雜度
5.二分查找法
6.簡單的排序演算法
a)冒泡排序法
b)插入排序法
7.貪心演算法經典題目
8.高等數學
以下為選修:
9.學會使用簡單的DOS命令(較重要)
a)color/dir//shutdown/mkdir(md)/rmdir(rd)/attrib/cd/
b)知道什麼是絕對路徑與相對路徑
c)學會使用C語言調用DOS命令
d)學會在命令提示符下調用你自己用C語言編寫的程序,並使用命令行參數給自己的程序傳參(比如自己製作一個file.exe實現與命令基本功能一致的功能)
e)學會編寫bat批處理文件
10.學會Windows系統的一些小知識,如設置隱藏文件,autoRun.inf的設置等。
11.學會編輯注冊表(包括使用注冊表編輯器regedit和使用DOS命令編輯注冊表)
12.學會使用組策略管理器管理(gpedit.msc)組策略。
大一下學期:
1.掌握C++部分語法,如引用類型,函數重載等,基本明白什麼是類。
2.學會BFS與DFS
a)迷宮求解(最少步數)
b)水池數目(NYOJ27)
c)圖像有用區域(NYOJ92)
d)樹的前序中序後序遍歷
3.動態規劃(15題以上),要學會使用循環的方法寫動態規劃,同時也要學會使用記憶化搜索的方法。
a)最大子串和
b)最長公共子序列
c)最長單調遞增子序列(O(n)與O(n log n)演算法都需要掌握)
d)01背包
e)RMQ演算法
4.學會分析與計算復雜程序的時間復雜度
5.學會使用棧與隊列等線性存儲結構
6.學會分治策略
7.排序演算法
a)歸並排序
b)快速排序
c)計數排序
8.數論
a)擴展歐幾里德演算法
b)求逆元
c)同餘方程
d)中國剩餘定理
9.博弈論
a)博弈問題與SG函數的定義
b)多個博弈問題SG值的合並
10.圖論:
a)圖的鄰接矩陣與鄰接表兩種常見存儲方式
b)歐拉路的判定
c)單最短路bellman-ford演算法dijkstra演算法。
d)最小生成樹的kruskal演算法與prim演算法。
11.學會使用C語言進行網路編程與多線程編程
12.高等數學
13.線性代數
a)明確線性代數的重要性,首先是課本必須學好
b)編寫一個Matrix類,進行矩陣的各種操作,並求編寫程序解線性方程組。
c)推薦做一兩道「矩陣運算」分類下的題目。
以下為選修,隨便選一兩個學學即可:
14.(較重要)使用C語言或C++編寫簡單程序來調用一些簡單的windows API,或者在linux下進行linux系統調用,其目的是明白什麼是API(應用程序介面)。
15.網頁設計
a)學習靜態網頁技術(html+css+javascript)
b)較具有藝術細胞的可以試試Photoshop
c)php或其它動態網頁技術
16.學習matlab,如果想參加數學建模大賽的話,需要學這個軟體。
大一假期(如果留校集訓)
1.掌握C++語法,並熟練使用STL
2.試著實現STL的一些基本容器和函數,使自己基本能看懂STL源碼
3.圖論
a)使用優先隊列優化Dijkstra和Prim
b)單源最短路徑之SPFA
c)差分約束系統
d)多源多點最短路徑之FloydWarshall演算法
e)求歐拉路(圈套圈演算法)
4.進行復雜模擬題訓練
5.拓撲排序
6.動態規劃進階
a)完全背包、多重背包等各種背包問題(參見背包九講)
b)POJ上完成一定數目的動態規劃題目
c)狀態壓縮動態規劃
d)樹形動態規劃
7.搜索
a)回溯法熟練應用
b)復雜的搜索題目練習
c)雙向廣度優先搜索
d)啟發式搜索(包括A*演算法,如八數碼問題)
8.計算幾何
a)判斷點是否在線段上
b)判斷線段相交
c)判斷矩形是否包含點
d)判斷圓與矩形關系
e)判斷點是否在多邊形內
f)判斷點到線段的最近點
g)計算兩個圓的公切線
h)求矩形的並的面積
i)求多邊形面積
j)求多邊形重心
k)求凸包
選修
9.可以學習一種C++的開發框架來編寫一些窗體程序玩玩(如MFC,Qt等)。
10.學習使用C或C++連接資料庫。
大二一整年:
1.數據結構
a)單調隊列
b)堆
c)並查集
d)樹狀數組
e)哈希表
f)線段樹
g)字典樹
2.圖論
a)強連通分量
b)雙連通分量(求割點,橋)
c)強連通分量與雙連通分量縮點
d)LCA、LCA與RMQ的轉化
e)二分圖匹配
i.二分圖最大匹配
ii.最小點集覆蓋
iii.最小路徑覆蓋
iv.二分圖最優匹配
v.二分圖多重匹配
f)網路流
i.最大流的基本SAP
ii.最大流的ISAP或者Dinic等高效演算法(任一)
iii.最小費用最大流
iv.最大流最小割定理
3.動態規劃多做題提高(10道難題以上)
4.數論
a)積性函數的應用
b)歐拉定理
c)費馬小定理
d)威樂遜定理
5.組合數學
a)群論基礎
b)Polya定理與計數問題
c)Catalan數
6.計算幾何
a)各種旋轉卡殼相關演算法
b)三維計算幾何演算法
7.理解資料庫原理,學會SQL語句
8.學好計算機組成原理
9.學習Transact-SQL語言,學會使用觸發器,存儲過程,學會資料庫事務等。
10.圖論二
a)網路流的各種構圖訓練(重要)
b)最小割與最小點權覆蓋等的關系(詳見《最小割模型在信息學競賽中的應用》一文)
c)次小生成樹
d)第k短路
e)最小比率生成樹
11.線性規劃
12.動態規劃更高級進階
13.KMP演算法
14.AC自動機理論與實現
15.博弈論之Alpha-beta剪枝
『叄』 計算機演算法設計與分析的目錄
第1章演算法概述
1.1演算法與程序
1.2演算法復雜性分析
習題1
第2章遞歸與分治策略
2.1遞歸的概念
2.2分治法的基本思想
2.3二分搜索技術
2.4大整數的乘法
2.5Strassen矩陣乘法
2.6棋盤覆蓋
2.7合並排序
2.8快速排序
2.9線性時間選擇
2.10最接近點對問題
2.11循環賽日程表
習題2
第3章動態規劃
3.1矩陣連乘問題
3.2動態規劃演算法的基本要素
.3.3最長公共子序列
3.4最大子段和
3.5凸多邊形最優三角剖分
3.6多邊形游戲
3.7圖像壓縮
3.8電路布線
3.9流水作業調度
3.100-1背包問題
3.11最優二叉搜索樹
3.12動態規劃加速原理
習題3
第4章貪心演算法
第5章回溯法
第6章分支限界法
第7章隨機化演算法
第8章線性規劃與網路流
第9章NP完全性理論與近似演算法
附錄AC++概要
參考文獻
『肆』 是的 計算機演算法
計算機演算法是以一步接一步的方式來詳細描述計算機如何將輸入轉化為所要求的輸出的過程,或者說,演算法是對計算機上執行的計算過程的具體描述。
編輯本段演算法性質一個演算法必須具備以下性質: (1)演算法首先必須是正確的,即對於任意的一組輸入,包括合理的輸入與不合理的輸入,總能得到預期的輸出。如果一個演算法只是對合理的輸入才能得到預期的輸出,而在異常情況下卻無法預料輸出的結果,那麼它就不是正確的。 (2)演算法必須是由一系列具體步驟組成的,並且每一步都能夠被計算機所理解和執行,而不是抽象和模糊的概念。 (3)每個步驟都有確定的執行順序,即上一步在哪裡,下一步是什麼,都必須明確,無二義性。 (4)無論演算法有多麼復雜,都必須在有限步之後結束並終止運行,即演算法的步驟必須是有限的。在任何情況下,演算法都不能陷入無限循環中。 一個問題的解決方案可以有多種表達方式,但只有滿足以上4個條件的解才能稱之為演算法。編輯本段重要演算法A*搜尋演算法
俗稱A星演算法。這是一種在圖形平面上,有多個節點的路徑,求出最低通過成本的演算法。常用於游戲中的NPC的移動計算,或線上游戲的BOT的移動計算上。該演算法像Dijkstra演算法一樣,可以找到一條最短路徑;也像BFS一樣,進行啟發式的搜索。
Beam Search
束搜索(beam search)方法是解決優化問題的一種啟發式方法,它是在分枝定界方法基礎上發展起來的,它使用啟發式方法估計k個最好的路徑,僅從這k個路徑出發向下搜索,即每一層只有滿意的結點會被保留,其它的結點則被永久拋棄,從而比分枝定界法能大大節省運行時間。束搜索於20 世紀70年代中期首先被應用於人工智慧領域,1976 年Lowerre在其稱為HARPY的語音識別系統中第一次使用了束搜索方法,他的目標是並行地搜索幾個潛在的最優決策路徑以減少回溯,並快速地獲得一個解。
二分取中查找演算法
一種在有序數組中查找某一特定元素的搜索演算法。搜素過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜素過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。這種搜索演算法每一次比較都使搜索范圍縮小一半。
Branch and bound
分支定界(branch and bound)演算法是一種在問題的解空間樹上搜索問題的解的方法。但與回溯演算法不同,分支定界演算法採用廣度優先或最小耗費優先的方法搜索解空間樹,並且,在分支定界演算法中,每一個活結點只有一次機會成為擴展結點。
數據壓縮
數據壓縮是通過減少計算機中所存儲數據或者通信傳播中數據的冗餘度,達到增大數據密度,最終使數據的存儲空間減少的技術。數據壓縮在文件存儲和分布式系統領域有著十分廣泛的應用。數據壓縮也代表著尺寸媒介容量的增大和網路帶寬的擴展。
Diffie–Hellman密鑰協商
Diffie–Hellman key exchange,簡稱「D–H」,是一種安全協議。它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道建立起一個密鑰。這個密鑰可以在後續的通訊中作為對稱密鑰來加密通訊內容。
Dijkstra』s 演算法
迪科斯徹演算法(Dijkstra)是由荷蘭計算機科學家艾茲格·迪科斯徹(Edsger Wybe Dijkstra)發明的。演算法解決的是有向圖中單個源點到其他頂點的最短路徑問題。舉例來說,如果圖中的頂點表示城市,而邊上的權重表示著城市間開車行經的距離,迪科斯徹演算法可以用來找到兩個城市之間的最短路徑。
動態規劃
動態規劃是一種在數學和計算機科學中使用的,用於求解包含重疊子問題的最優化問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於計算機科學和工程領域。比較著名的應用實例有:求解最短路徑問題,背包問題,項目管理,網路流優化等。這里也有一篇文章說得比較詳細。
歐幾里得演算法
在數學中,輾轉相除法,又稱歐幾里得演算法,是求最大公約數的演算法。輾轉相除法首次出現於歐幾里得的《幾何原本》(第VII卷,命題i和ii)中,而在中國則可以追溯至東漢出現的《九章算術》。
最大期望(EM)演算法
在統計計算中,最大期望(EM)演算法是在概率(probabilistic)模型中尋找參數最大似然估計的演算法,其中概率模型依賴於無法觀測的隱藏變數(Latent Variable)。最大期望經常用在機器學習和計算機視覺的數據聚類(Data Clustering)領域。最大期望演算法經過兩個步驟交替進行計算,第一步是計算期望(E),利用對隱藏變數的現有估計值,計算其最大似然估計值;第二步是最大化(M),最大化在 E 步上求得的最大似然值來計算參數的值。M 步上找到的參數估計值被用於下一個 E 步計算中,這個過程不斷交替進行。
快速傅里葉變換(FFT)
快速傅里葉變換(Fast Fourier Transform,FFT),是離散傅里葉變換的快速演算法,也可用於計算離散傅里葉變換的逆變換。快速傅里葉變換有廣泛的應用,如數字信號處理、計算大整數乘法、求解偏微分方程等等。
哈希函數
HashFunction是一種從任何一種數據中創建小的數字「指紋」的方法。該函數將數據打亂混合,重新創建一個叫做散列值的指紋。散列值通常用來代表一個短的隨機字母和數字組成的字元串。好的散列函數在輸入域中很少出現散列沖突。在散列表和數據處理中,不抑制沖突來區別數據,會使得資料庫記錄更難找到。
堆排序
Heapsort是指利用堆積樹(堆)這種數據結構所設計的一種排序演算法。堆積樹是一個近似完全二叉樹的結構,並同時滿足堆積屬性:即子結點的鍵值或索引總是小於(或者大於)它的父結點。
歸並排序
Merge sort是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
RANSAC 演算法
RANSAC 是」RANdom SAmpleConsensus」的縮寫。該演算法是用於從一組觀測數據中估計數學模型參數的迭代方法,由Fischler and Bolles在1981提出,它是一種非確定性演算法,因為它只能以一定的概率得到合理的結果,隨著迭代次數的增加,這種概率是增加的。該演算法的基本假設是觀測數據集中存在」inliers」(那些對模型參數估計起到支持作用的點)和」outliers」(不符合模型的點),並且這組觀測數據受到雜訊影響。RANSAC 假設給定一組」inliers」數據就能夠得到最優的符合這組點的模型。
RSA加密演演算法
這是一個公鑰加密演算法,也是世界上第一個適合用來做簽名的演算法。今天的RSA已經專利失效,其被廣泛地用於電子商務加密,大家都相信,只要密鑰足夠長,這個演算法就會是安全的。
並查集Union-find
並查集是一種樹型的數據結構,用於處理一些不相交集合(Disjoint Sets)的合並及查詢問題。常常在使用中以森林來表示。
Viterbi algorithm
尋找最可能的隱藏狀態序列(Finding most probable sequence of hidden states)。編輯本段演算法特點1.有窮性。一個演算法應包含有限的操作步驟,而不能是無限的。事實上「有窮性」往往指「在合理的范圍之內」。如果讓計算機執行一個歷時1000年才結束的演算法,這雖然是有窮的,但超過了合理的限度,人們不把他是為有效演算法。 2. 確定性。演算法中的每一個步驟都應當是確定的,而不應當是含糊的、模稜兩可的。演算法中的每一個步驟應當不致被解釋成不同的含義,而應是十分明確的。也就是說,演算法的含義應當是唯一的,而不應當產生「歧義性」。 3. 有零個或多個輸入、所謂輸入是指在執行演算法是需要從外界取得必要的信息。 4. 有一個或多個輸出。演算法的目的是為了求解,沒有輸出的演算法是沒有意義的。 5.有效性。 演算法中的每一個 步驟都應當能有效的執行。並得到確定的結果。編輯本段演算法與程序雖然演算法與計算機程序密切相關,但二者也存在區別:計算機程序是演算法的一個實例,是將演算法通過某種計算機語言表達出來的具體形式;同一個演算法可以用任何一種計算機語言來表達。 演算法列表 圖論 路徑問題 0/1邊權最短路徑 BFS 非負邊權最短路徑(Dijkstra) 可以用Dijkstra解決問題的特徵 負邊權最短路徑 Bellman-Ford Bellman-Ford的Yen-氏優化 差分約束系統 Floyd 廣義路徑問題 傳遞閉包 極小極大距離 / 極大極小距離 Euler Path / Tour 圈套圈演算法 混合圖的 Euler Path / Tour Hamilton Path / Tour 特殊圖的Hamilton Path / Tour 構造 生成樹問題 最小生成樹 第k小生成樹 最優比率生成樹 0/1分數規劃 度限制生成樹 連通性問題 強大的DFS演算法 無向圖連通性 割點 割邊 二連通分支 有向圖連通性 強連通分支 2-SAT 最小點基 有向無環圖 拓撲排序 有向無環圖與動態規劃的關系 二分圖匹配問題 一般圖問題與二分圖問題的轉換思路 最大匹配 有向圖的最小路徑覆蓋 0 / 1矩陣的最小覆蓋 完備匹配 最優匹配 穩定婚姻 網路流問題 網路流模型的簡單特徵和與線性規劃的關系 最大流最小割定理 最大流問題 有上下界的最大流問題 循環流 最小費用最大流 / 最大費用最大流 弦圖的性質和判定 組合數學 解決組合數學問題時常用的思想 逼近 遞推 / 動態規劃 概率問題 Polya定理 計算幾何 / 解析幾何 計算幾何的核心:叉積 / 面積 解析幾何的主力:復數 基本形 點 直線,線段 多邊形 凸多邊形 / 凸包 凸包演算法的引進,卷包裹法 Graham掃描法 水平序的引進,共線凸包的補丁 完美凸包演算法 相關判定 兩直線相交 兩線段相交 點在任意多邊形內的判定 點在凸多邊形內的判定 經典問題 最小外接圓 近似O(n)的最小外接圓演算法 點集直徑 旋轉卡殼,對踵點 多邊形的三角剖分 數學 / 數論 最大公約數 Euclid演算法 擴展的Euclid演算法 同餘方程 / 二元一次不定方程 同餘方程組 線性方程組 高斯消元法 解mod 2域上的線性方程組 整系數方程組的精確解法 矩陣 行列式的計算 利用矩陣乘法快速計算遞推關系 分數 分數樹 連分數逼近 數論計算 求N的約數個數 求phi(N) 求約數和 快速數論變換 …… 素數問題 概率判素演算法 概率因子分解 數據結構 組織結構 二叉堆 左偏樹 二項樹 勝者樹 跳躍表 樣式圖標 斜堆 reap 統計結構 樹狀數組 虛二叉樹 線段樹 矩形面積並 圓形面積並 關系結構 Hash表 並查集 路徑壓縮思想的應用 STL中的數據結構 vector deque set / map 動態規劃 / 記憶化搜索 動態規劃和記憶化搜索在思考方式上的區別 最長子序列系列問題 最長不下降子序列 最長公共子序列 一類NP問題的動態規劃解法 樹型動態規劃 背包問題 動態規劃的優化 四邊形不等式 函數的凸凹性 狀態設計 規劃方向 線性規劃 常用思想 二分 最小表示法 串 KMP Trie結構 後綴樹/後綴數組 LCA/RMQ 有限狀態自動機理論 排序 選擇/冒泡 快速排序 堆排序 歸並排序 基數排序 拓撲排序 排序網路
擴展閱讀:
1
《計算機演算法設計與分析導論》朱清新等編著人民郵電出版社
開放分類:
計算機,演算法
『伍』 200分求動態規劃詳解!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
嗯···我學動歸不是很久,同樣是迷惘過,估計兩個月前剛剛開竅……
你看他寫的什麼無後效性什麼最優子結構的就頭大,我也頭大%…………
動態規劃一般解決兩類問題,一類是最優化問題,就是問你最大價值最小數什麼的,另一類是方案總數問題。
細分的話類型很多,
我見得多的(我是高二學生,目前在籌備NOIP)
(你那題多我就只說名字了)
背包,樓上連9講都放上來了我就不多說了……
最長不上升不下降子序列問題(比如說潘帕斯雄鷹生日模擬賽的飛翔,就是很經典的不下降的變形)
資源分配問題(比如說櫥窗布置,馬棚問題,機器分配問題)
區間動歸(乘積最大,能量項鏈等等)
最長公共子序列問題(有個遺傳編碼好像);
解決方案樹的比如說爬樓梯問題……………………
動態規劃的類型很多很多,因為他很靈活的,我們老師曾經給我們找了100個DP方程,但是那都沒有用,強記根本記不住,關鍵是理解。
深入一點的就有DP的優化,時間空間的降維(就是用別的方法去做,或者比如說背包本來是二維的空間優化過該成一維的了),樹形DP(這個我也不會)。
(優化裡面有個很經典的題《過河》)
我對DP是屬於那種突然就開了竅的……別看說「動態規劃」什麼的唬人,其實就是一個比較一個計算,知道他干什麼了題上來就有頭緒,方程啊思想啊就有了……
主要也是多看題吧,從簡單的開始,理解他的思想……自己寫動歸的時候注意下面幾個問題:
1、大前提是確定你做的是動歸題……看得多了也就知道自己面對的是什麼類型的題了
2、次前提是想法要對(我做題的時候先想這道題時間空間的維度,然後根據這個去想方程),方程正確,
實在想不起來可以先看題解,去理解人家的思想之後,不要看標程把程序做出來……
3、注意數組不要開的過小,一般都是左右都開大一點,比如他的數據范圍是1~100 ,數組就開0~101.這個是防越界的,因為很多DP賦初值的時候會用到F[0],F[0,0]
4、初始值要正確,因為很多DP其他地方都是正確的因為初始值賦錯了而全部過不了的情況是很常見的……(比如說USACO裡面的貨幣系統)
5、DP循環的范圍要正確,一般根據題來判斷范圍寫多少的(比如說櫥窗問題,今天下午寫這個題因為循環寫錯了一直AC不了)
USACO里也有很多DP題,可以做……
以上全部手打,希望能對你有所幫助。
我也是正在學習的人,上面的東西不一定全部正確,但是對我而言很受用,也算是我的經驗了。希望日後能一起學習交流外加進步嘍
QQ:340131980
1. 資源問題1
-----機器分配問題
F[I,j]:=max(f[i-1,k]+w[i,j-k])
2. 資源問題2
------01背包問題
F[I,j]:=max(f[i-1,j-v]+w,f[i-1,j]);
3. 線性動態規劃1
-----樸素最長非降子序列
F:=max{f[j]+1}
4. 剖分問題1
-----石子合並
F[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]);
5. 剖分問題2
-----多邊形剖分
F[I,j]:=min(f[i,k]+f[k,j]+a[k]*a[j]*a);
6. 剖分問題3
------乘積最大
f[i,j]:=max(f[k,j-1]*mult[k,i]);
7. 資源問題3
-----系統可靠性(完全背包)
F[i,j]:=max{f[i-1,j-c*k]*P[I,x]}
8. 貪心的動態規劃1
-----快餐問題
F[i,j,k]:=max{f[i-1,j',k']+(T-(j-j')*p1-(k-k')*p2) div p3}
9. 貪心的動態規劃2
-----過河 f=min{{f(i-k)} (not stone)
{f(i-k)}+1} (stone); +貪心壓縮狀態
10. 剖分問題4
-----多邊形-討論的動態規劃
F[i,j]:=max{正正 f[I,k]*f[k+1,j];
負負 g[I,k]*f[k+1,j];
正負 g[I,k]*f[k+1,j];
負正 f[I,k]*g[k+1,j];} g為min
11. 樹型動態規劃1
-----加分二叉樹 (從兩側到根結點模型)
F[I,j]:=max{f[I,k-1]*f[k+1,j]+c[k]}
12. 樹型動態規劃2
-----選課 (多叉樹轉二叉樹,自頂向下模型)
F[I,j]表示以i為根節點選j門功課得到的最大學分
f[i,j]:=max{f[t.l,k]+f[t.r,j-k-1]+c}
13. 計數問題1
-----砝碼稱重
f[f[0]+1]=f[j]+k*w[j];
(1<=i<=n; 1<=j<=f[0]; 1<=k<=a;)
14. 遞推天地1
------核電站問題
f[-1]:=1; f[0]:=1;
f:=2*f[i-1]-f[i-1-m]
15. 遞推天地2
------數的劃分
f[i,j]:=f[i-j,j]+f[i-1,j-1];
16. 最大子矩陣1
-----一最大01子矩陣
f[i,j]:=min(f[i-1,j],v[i,j-1],v[i-1,j-1])+1;
ans:=maxvalue(f);
17. 判定性問題1
-----能否被4整除
g[1,0]:=true; g[1,1]:=false; g[1,2]:=false; g[1,3]:=false;
g[i,j]:=g[i-1,k] and ((k+a[i,p]) mod 4 = j)
18. 判定性問題2
-----能否被k整除
f[I,j±n mod k]:=f[i-1,j]; -k<=j<=k; 1<=i<=n
20. 線型動態規劃2
-----方塊消除游戲
f[i,i-1,0]:=0
f[i,j,k]:=max{f[i,j-1,0]+sqr(len(j)+k),
f[i,p,k+len[j]]+f[p+1,j-1,0]}
ans:=f[1,m,0]
21. 線型動態規劃3
-----最長公共子串,LCS問題
f[i,j]={0(i=0)&(j=0);
f[i-1,j-1]+1 (i>0,j>0,x=y[j]);
max{f[i,j-1]+f[i-1,j]}} (i>0,j>0,x<>y[j]);
22. 最大子矩陣2
-----最大帶權01子矩陣O(n^2*m)
枚舉行的起始,壓縮進數列,求最大欄位和,遇0則清零
23. 資源問題4
-----裝箱問題(判定性01背包)
f[j]:=(f[j] or f[j-v]);
24. 數字三角形1
-----樸素の數字三角形
f[i,j]:=max(f[i+1,j]+a[I,j],f[i+1,j+1]+a[i,j]);
25. 數字三角形2
-----晴天小豬歷險記之Hill
同一階段上暴力動態規劃
if[i,j]:=min(f[i,j-1],f[I,j+1],f[i-1,j],f[i-1,j-1])+a[i,j]
26. 雙向動態規劃1
數字三角形3
-----小胖辦證
f[i,j]:=max(f[i-1,j]+a[i,j],f[i,j-1]+a[i,j],f[i,j+1]+a[i,j])
27. 數字三角形4
-----過河卒
//邊界初始化
f[i,j]:=f[i-1,j]+f[i,j-1];
28. 數字三角形5
-----樸素的打磚塊
f[i,j,k]:=max(f[i-1,j-k,p]+sum[i,k],f[i,j,k]);
29. 數字三角形6
-----優化的打磚塊
f[I,j,k]:=max{g[i-1,j-k,k-1]+sum[I,k]}
30. 線性動態規劃3
-----打鼴鼠』
f:=f[j]+1;(abs(x-x[j])+abs(y-y[j])<=t-t[j])
31. 樹形動態規劃3
-----貪吃的九頭龍
32. 狀態壓縮動態規劃1
-----炮兵陣地
Max(f[Q*(r+1)+k],g[j]+num[k])
If (map and plan[k]=0) and
((plan[P] or plan[q]) and plan[k]=0)
33. 遞推天地3
-----情書抄寫員
f:=f[i-1]+k*f[i-2]
34. 遞推天地4
-----錯位排列
f:=(i-1)(f[i-2]+f[i-1]);
f[n]:=n*f[n-1]+(-1)^(n-2);
35. 遞推天地5
-----直線分平面最大區域數
f[n]:=f[n-1]+n
:=n*(n+1) div 2 + 1;
36. 遞推天地6
-----折線分平面最大區域數
f[n]:=(n-1)(2*n-1)+2*n;
37. 遞推天地7
-----封閉曲線分平面最大區域數
f[n]:=f[n-1]+2*(n-1)
:=sqr(n)-n+2;
38 遞推天地8
-----凸多邊形分三角形方法數
f[n]:=C(2*n-2,n-1) div n;
對於k邊形
f[k]:=C(2*k-4,k-2) div (k-1); //(k>=3)
39 遞推天地9
-----Catalan數列一般形式
1,1,2,5,14,42,132
f[n]:=C(2k,k) div (k+1);
40 遞推天地10
-----彩燈布置
排列組合中的環形染色問題
f[n]:=f[n-1]*(m-2)+f[n-2]*(m-1); (f[1]:=m; f[2]:=m(m-1);
41 線性動態規劃4
-----找數
線性掃描
sum:=f+g[j];
(if sum=Aim then getout; if sum<Aim then inc(i) else inc(j);)
42 線性動態規劃5
-----隱形的翅膀
min:=min{abs(w/w[j]-gold)};
if w/w[j]<gold then inc(i) else inc(j);
43 剖分問題5
-----最大獎勵
f:=max(f,f[j]+(sum[j]-sum)*i-t
44 最短路1
-----Floyd
f[i,j]:=max(f[i,j],f[i,k]+f[k,j]);
ans[q[i,j,k]]:=ans[q[i,j,k]]+s[i,q[i,j,k]]*s[q[i,j,k],j]/s[i,j];
45 剖分問題6
-----小H的小屋
F[l,m,n]:=f[l-x,m-1,n-k]+S(x,k);
46 計數問題2
-----隕石的秘密(排列組合中的計數問題)
Ans[l1,l2,l3,D]:=f[l1+1,l2,l3,D+1]-f[l1+1,l2,l3,D];
F[l1,l2,l3,D]:=Sigma(f[o,p,q,d-1]*f[l1-o,l2-p,l3-q,d]);
47 線性動態規劃
------合唱隊形
兩次F:=max{f[j]+1}+枚舉中央結點
48 資源問題
------明明的預算方案:加花的動態規劃
f[i,j]:=max(f[i,j],f[l,j-v-v[fb]-v[fa]]+v*p+v[fb]*p[fb]+v[fa]*p[fa]);
49 資源問題
-----化工場裝箱員
50 樹形動態規劃
-----聚會的快樂
f[i,2]:=max(f[i,0],f[i,1]);
f[i,1]:=sigma(f[t^.son,0]);
f[i,0]:=sigma(f[t^.son,3]);
51 樹形動態規劃
-----皇宮看守
f[i,2]:=max(f[i,0],f[i,1]);
f[i,1]:=sigma(f[t^.son,0]);
f[i,0]:=sigma(f[t^.son,3]);
52 遞推天地
-----盒子與球
f[i,1]:=1;
f[i,j]:=j*(f[i-1,j-1]+f[i-1,j]);
53 雙重動態規劃
-----有限的基因序列
f:=min{f[j]+1}
g[c,i,j]:=(g[a,i,j] and g[b,i,j]) or (g[c,i,j])
54 最大子矩陣問題
-----居住空間
f[i,j,k]:=min(min(min(f[i-1,j,k],f[i,j-1,k]),
min(f[i,j,k-1],f[i-1,j-1,k])),
min(min(f[i-1,j,k-1],f[i,j-1,k-1]),
f[i-1,j-1,k-1]))+1;
55 線性動態規劃
------日程安排
f:=max{f[j]}+P[I]; (e[j]<s)
56 遞推天地
------組合數
C[I,j]:=C[i-1,j]+C[I-1,j-1]
C[I,0]:=1
57 樹形動態規劃
-----有向樹k中值問題
F[I,r,k]:=max{max{f[l,I,j]+f[r,I,k-j-1]},f[f[l,r,j]+f[r,r,k-j]+w[I,r]]}
58 樹形動態規劃
-----CTSC 2001選課
F[I,j]:=w(if i∈P)+f[l,k]+f[r,m-k](0≤k≤m)(if l<>0)
59 線性動態規劃
-----多重歷史
f[i,j]:=sigma{f[i-k,j-1]}(if checked)
60 背包問題(+-1背包問題+回溯)
-----CEOI1998 Substract
f[i,j]:=f[i-1,j-a] or f[i-1,j+a]
61 線性動態規劃(字元串)
-----NOI 2000 古城之謎
f[i,1,1]:=min{f[i+length(s),2,1], f[i+length(s),1,1]+1}f[i,1,2]:=min{f[i+length(s),1,2]+words[s],f[i+length(s),1,2]+words[s]}
62 線性動態規劃
-----最少單詞個數
f[i,j]:=max{f[I,j],f[u-1,j-1]+l}
63 線型動態規劃
-----APIO2007 數據備份
狀態壓縮+剪掉每個階段j前j*2個狀態和j*2+200後的狀態貪心動態規劃
f:=min(g[i-2]+s,f[i-1]);
64 樹形動態規劃
-----APIO2007 風鈴
f:=f[l]+f[r]+{1 (if c[l]<c[r])}
g:=1(d[l]<>d[r]) 0(d[l]=d[r])
g[l]=g[r]=1 then Halt;
65 地圖動態規劃
-----NOI 2005 adv19910
F[t,i,j]:=max{f[t-1,i-dx[d[[t]],j-dy[d[k]]]+1],f[t-1,i,j];
66 地圖動態規劃
-----優化的NOI 2005 adv19910
F[k,i,j]:=max{f[k-1,i,p]+1} j-b[k]<=p<=j;
67 目標動態規劃
-----CEOI98 subtra
F[I,j]:=f[I-1,j+a] or f[i-1,j-a]
68 目標動態規劃
----- Vijos 1037搭建雙塔問題
F[value,delta]:=g[value+a,delta+a] or g[value,delta-a]
69 樹形動態規劃
-----有線電視網
f[i,p]:=max(f[i,p],f[i,p-q]+f[j,q]-map[i,j])
leaves>=p>=l, 1<=q<=p;
70 地圖動態規劃
-----vijos某題
F[I,j]:=min(f[i-1,j-1],f[I,j-1],f[i-1,j]);
71 最大子矩陣問題
-----最大欄位和問題
f:=max(f[i-1]+b,b); f[1]:=b[1]
72 最大子矩陣問題
-----最大子立方體問題
枚舉一組邊i的起始,壓縮進矩陣 B[I,j]+=a[x,I,j]
枚舉另外一組邊的其實,做最大子矩陣
73 括弧序列
-----線型動態規劃
f[I,j]:=min(f[I,j],f[i+1,j-1](ss[j]=」()」or(」[]」)),
f[I+1,j+1]+1 (s[j]=」(」or」[」 ] , f[I,j-1]+1(s[j]=」)」or」]」 )
74 棋盤切割
-----線型動態規劃
f[k,x1,y1,x2,y2]=min{min{f[k-1,x1,y1,a,y2]+s[a+1,y1,x2,y2],
f[k-1,a+1,y1,x2,y2]+s[x1,y1,a,y2]
min{}}
75 概率動態規劃
-----聰聰和可可(NOI2005)
x:=p[p[i,j],j]
f[I,j]:=(f[x,b[j,k]]+f[x,j])/(l[j]+1)+1
f[I,i]=0
f[x,j]=1
76 概率動態規劃
-----血緣關系
F[A, B]=(f[A0, B]+P[A1, B])/2
f[I,i]=1
f[I,j]=0(I,j無相同基因)
77 線性動態規劃
-----決斗
F[I,j]=(f[I,j] and f[k,j]) and (e[I,k] or e[j,k]),i<k<j
78 線性動態規劃
-----舞蹈家
F[x,y,k]=min(f[a[k],y,k+1]+w[x,a[k]],f[x,a[k],k+1]+w[y,a[k]])
79 線性動態規劃
-----積木游戲
F[I,a,b,k]=max(f[I,a+1,b,k],f[i+1,a+1,a+1,k』],f[I,a+1,a+1,k』])
80 樹形動態規劃(雙次記錄)
-----NOI2003 逃學的小孩
樸素的話枚舉節點i和離其最遠的兩個節點 j,k O(n^2)
每個節點記錄最大的兩個值,並記錄這最大值分別是從哪個相鄰節點傳過來的。當遍歷到某個孩子節點的時候,只需檢查最大值是否是從該孩子節點傳遞來的。如果是,就取次大,否則取最大值
81 樹形動態規劃(完全二叉樹)
-----NOI2006 網路收費
F[I,j,k]表示在點i所管轄的所有用戶中,有j個用戶為A,在I的每個祖先u上,如果N[a]>N則標0否則標1,用二進制狀態壓縮進k中,在這種情況下的最小花費
F[I,j,k]:=min{f[l,u,k and (s<<(i-1))]+w1,f[r,j-u,k and(s<<(i-1))]}
82 樹形動態規劃
-----IOI2005 河流
F:=max
83 記憶化搜索
-----Vijos某題,忘了
F[pre,h,m]:=sigma{SDP(I,h+1,M+i)} (pre<=i<=M+1)
84 狀態壓縮動態規劃
-----APIO 2007 動物園
f[I,k]:=f[i-1,k and not (1<<4)] + NewAddVal
85 樹形動態規劃
-----訪問術館
f[i,j-c×2]:= max ( f[l,k], f[r,j-c×2-k] )
86 字元串動態規劃
-----Ural 1002 Phone
if exist((s,j,i-j)) then f:=min(f,f[j]+1);
87 多進程動態規劃
-----CEOI 2005 service
Min( f[i,j,k], f[i-1,j,k] + c[t[i-1],t] )
Min( f[i,t[i-1],k], f[i-1,j,k] + c[j,t] )
Min( f[i,j,t[i-1]], f[i-1,j,k] + c[k,t] )
88 多進程動態規劃
-----Vijos1143 三取方格數
max(f[i,j,k,l],f[i-1,j-R[m,1],k-R[m,2],l-R[m,3]]);
if (j=k) and (k=l) then inc(f[i,j,k,l],a[j,i-j]) else
if (j=k) then inc(f[i,j,k,l],a[j,i-j]+a[l,i-l]) else
if (k=l) then inc(f[i,j,k,l],a[j,i-j]+a[k,i-k]) else
if (j=l) then inc(f[i,j,k,l],a[j,i-j]+a[k,i-k]) else
inc(f[i,j,k,l],a[j,i-j]+a[k,i-k]+a[l,i-l]);
89 線型動態規劃
-----IOI 2000 郵局問題
f[i,j]:=min(f[I,j],f[k,j-1]+d[k+1,i]);
90 線型動態規劃
-----Vijos 1198 最佳課題選擇
if j-k>=0 then Min(f[i,j],f[i-1,j-k]+time(i,k));
91 背包問題
----- USACO Raucous Rockers
多個背包,不可以重復放物品,但放物品的順序有限制。
F[I,j,k]表示決策到第i個物品、第j個背包,此背包花費了k的空間。
f[I,j,k]:=max(f[I-1,j,k],f[I-1,j,k-t]+p,f[i-1,j-1,maxtime-t])
92 多進程動態規劃
-----巡遊加拿大(IOI95、USACO)
d[i,j]=max{d[k,j]+1(a[k,i] & j<k<i),d[j,k]+1(a[I,j] & (k<j))}。
f[i,j]表示從起點出發,一個人到達i,另一個人到達j時經過的城市數。d[i,j]=d[j,i],所以我們限制i>j
分析狀態(i,j),它可能是(k,j)(j<k<i)中k到達i得到(方式1),也可能是(j,k)(k<j)中k超過j到達i得到(方式2)。但它不能是(i,k)(k<j)中k到達j得到,因為這樣可能會出現重復路徑。即使不會出現重復路徑,那麼它由(j,k)通過方式2同樣可以得到,所以不會遺漏解 時間復雜度O(n3)
93 動態規劃
-----ZOJ cheese
f[i,j]:=f[i-kk*zl[u,1],j-kk*zl[u,2]]+a[i-kk*zl[u,1],j-kk*zl[u,2]]
94 動態規劃
-----NOI 2004 berry 線性
F[I,1]:=s
F[I,j]:=max{min{s-s[l-1]},f[l-1,j-1]} (2≤j≤k, j≤l≤i)
95 動態規劃
-----NOI 2004 berry 完全無向圖
F[I,j]:=f[i-1,j] or (j≥w) and (f[i-1,j-w])
96 動態規劃
-----石子合並 四邊形不等式優化
m[i,j]=max{m[i+1,j], m[i,j-1]}+t[i,j]
97 動態規劃
-----CEOI 2005 service
(k≥long,i≥1)g[i, j, k]=max{g[i-1,j,k-long]+1,g[i-1,j,k]}
(k<long,i≥1) g[i, j, k]=max{g[i-1,j-1,t-long]+1,g[i-1,j,k]}
(0≤j≤m, 0≤k<t) g[0,j,k]=0;
ans:=g[n,m,0]。
狀態優化:g[i, j]=min{g[i-1,j],g[i-1,j-1]+long}
其中(a, b)+long=(a』, b』)的計算方法為:
當b+long ≤t時: a』=a; b』=b+long;
當b+long >t時: a』=a+1; b』=long;
規劃的邊界條件:
當0≤i≤n時,g[i,0]=(0,0)
98 動態規劃
-----AHOI 2006寶庫通道
f[k]:=max{f[k-1]+x[k,j]-x[k,i-1], x[k,j]-x[k,i-1]}
99 動態規劃
-----Travel
A) 費用最少的旅行計劃。
設f表示從起點到第i個旅店住宿一天的最小費用;g表示從起點到第i個旅店住宿一天,在滿足最小費用的前提下所需要的最少天數。那麼:
f=f[x]+v, g=g[x]+1
x滿足:
1、 x<i,且d – d[x] <= 800(一天的最大行程)。
2、 對於所有的t < i, d – d[t] <= 800,都必須滿足:
A. g[x] < g[t](f[x] = f[t]時) B. f[x] < f[t] (其他情況)
f[0] = 0,g[0] = 0。 Ans:=f[n + 1],g[n+1]。
B). 天數最少的旅行計劃。
方法其實和第一問十分類似。
設g』表示從起點到第i個旅店住宿一天的最少天數;f』表示從起點到第i個旅店住宿一天,在滿足最小天數前提下所需要的最少費用。那麼:
g』 = g』[x] + 1, f』 = f』[x] + v
x滿足:
1、 x<i,且d – d[x] <= 800(一天的最大行程)。
2、 對於所有的t < i, d – d[t] <= 800,都必須滿足:
f』[x] < f』[t] g』[x] = g』[t]時
g』[x] < g』[t] 其他情況
f』[0] = 0,g』[0] = 0。 Ans:=f』[n + 1],g』[n+1]。
100 動態規劃
-----NOI 2007 cash
y:=f[j]/(a[j]*c[j]+b[j]);
g:=c[j]*y*a+y*b;
f:=max(f,g)
『陸』 動態規劃演算法如何實現 .bmp灰度圖像壓縮的壓縮與解壓縮啊
誒,轉回來了。但是還差一點。。到底是哪呢。。
『柒』 acm競賽知識點
1. acm常用小知識點
acm常用小知識點 1.ACM 關於ACM程序設計競賽,需要掌握哪些知識點,最好能詳細一
訓練過ACM等程序設計競賽的人在演算法上有較大的優勢,這就說明當你編程能力提高之後,主要時間是花在思考演算法上,不是花在寫程序與debug上。
下面給個計劃你練練:第一階段:練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡代碼,因為太常用,所以要練到寫時不用想,10-15分鍾內打完,甚至關掉顯示器都可以把程序打出來。1.最短路(Floyd、Dijstra,BellmanFord) 2.最小生成樹(先寫個prim,kruscal要用並查集,不好寫) 3.大數(高精度)加減乘除4.二分查找. (代碼可在五行以內) 5.叉乘、判線段相交、然後寫個凸包. 6.BFS、DFS,同時熟練hash表(要熟,要靈活,代碼要簡) 7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式. 8. 調用系統的qsort, 技巧很多,慢慢掌握. 9. 任意進制間的轉換第二階段:練習復雜一點,但也較常用的演算法。
如: 1. 二分圖匹配(匈牙利),最小路徑覆蓋 2. 網路流,最小費用流。 3. 線段樹. 4. 並查集。
5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp 6.博弈類演算法。博弈樹,二進製法等。
7.最大團,最大獨立集。 8.判斷點在多邊形內。
9. 差分約束系統. 10. 雙向廣度搜索、A*演算法,最小耗散優先.第三階段: 前兩個階段是打基礎,第三階段是鍛煉在比賽中可以快速建立模型、想新演算法。這就要平時多做做綜合的題型了。
1. 把oibh上的論文看看(大概幾百篇的,我只看了一點點,呵呵)。 2. 平時掃掃zoj上的難題啦,別老做那些不用想的題.(中大acm的版主經常說我挑簡單的來做:-P ) 3. 多參加網上的比賽,感受一下比賽的氣氛,評估自己的實力. 4. 一道題不要過了就算,問一下人,有更好的演算法也打一下。
5. 做過的題要記好 :-)下面轉自:ACMer必備知識(任重而道遠。)
圖論 路徑問題 0/1邊權最短路徑 BFS 非負邊權最短路徑(Dijkstra) 可以用Dijkstra解決問題的特徵 負邊權最短路徑 Bellman-Ford Bellman-Ford的Yen-氏優化 差分約束系統 Floyd 廣義路徑問題 傳遞閉包 極小極大距離 / 極大極小距離 Euler Path / Tour 圈套圈演算法 混合圖的 Euler Path / Tour Hamilton Path / Tour 特殊圖的Hamilton Path / Tour 構造 生成樹問題 最小生成樹 第k小生成樹 最優比率生成樹 0/1分數規劃 度限制生成樹 連通性問題 強大的DFS演算法 無向圖連通性 割點 割邊 二連通分支 有向圖連通性 強連通分支 2-SAT 最小點基 有向無環圖 拓撲排序 有向無環圖與動態規劃的關系 二分圖匹配問題 一般圖問題與二分圖問題的轉換思路 最大匹配 有向圖的最小路徑覆蓋 0 / 1矩陣的最小覆蓋 完備匹配 最優匹配 穩定婚姻 網路流問題 網路流模型的簡單特徵和與線性規劃的關系 最大流最小割定理 最大流問題 有上下界的最大流問題 循環流 最小費用最大流 / 最大費用最大流 弦圖的性質和判定組合數學 解決組合數學問題時常用的思想 逼近 遞推 / 動態規劃 概率問題 Polya定理計算幾何 / 解析幾何 計算幾何的核心:叉積 / 面積 解析幾何的主力:復數 基本形 點 直線,線段 多邊形 凸多邊形 / 凸包 凸包演算法的引進,卷包裹法 Graham掃描法 水平序的引進,共線凸包的補丁 完美凸包演算法 相關判定 兩直線相交 兩線段相交 點在任意多邊形內的判定 點在凸多邊形內的判定 經典問題 最小外接圓 近似O(n)的最小外接圓演算法 點集直徑 旋轉卡殼,對踵點 多邊形的三角剖分數學 / 數論 最大公約數 Euclid演算法 擴展的Euclid演算法 同餘方程 / 二元一次不定方程 同餘方程組 線性方程組 高斯消元法 解mod 2域上的線性方程組 整系數方程組的精確解法 矩陣 行列式的計算 利用矩陣乘法快速計算遞推關系 分數 分數樹 連分數逼近 數論計算 求N的約數個數 求phi(N) 求約數和 快速數論變換 …… 素數問題 概率判素演算法 概率因子分解數據結構 組織結構 二叉堆 左偏樹 二項樹 勝者樹 跳躍表 樣式圖標 斜堆 reap 統計結構 樹狀數組 虛二叉樹 線段樹 矩形面積並 圓形面積並 關系結構 Hash表 並查集 路徑壓縮思想的應用 STL中的數據結構 vector deque set / map動態規劃 / 記憶化搜索 動態規劃和記憶化搜索在思考方式上的區別 最長子序列系列問題 最長不下降子序列 最長公共子序列 最長公共不下降子序列 一類NP問題的動態規劃解法 樹型動態規劃 背包問題 動態規劃的優化 四邊形不等式 函數的凸凹性 狀態設計 規劃方向線性規劃常用思想 二分 最小表示法串 KMP Trie結構 後綴樹/後綴數組 LCA/RMQ 有限狀態自動機理論排序 選擇/冒泡 快速排序 堆排序 歸並排序 基數排序 拓撲排序 排序網路。
2.ACM需要具備什麼知識
ACM國際大學生程序設計競賽(ACM/ICPC :ACM International Collegiate Programming Contest)是由國際計算機界歷史悠久、頗具權威性的組織ACM( 美國計算機協會)學會(Association for puter Machineary)主辦,是世界上公認的規模最大、水平最高的國際大學生程序設計競賽,其目的旨在使大學生運用計算機來充分展示自已分析問題和解決問題的能力。該項競賽從1970年舉辦至今已歷25屆,因歷屆競賽都薈萃了世界各大洲的精英,雲集了計算機界的「希望之星」,而受到國際各知名大學的重視,並受到全世界各著名計算機公司如Microsoft(微軟公司) 、IBM等的高度關注,成為世界各國大學生最具影響力的國際級計算機類的賽事,ACM所頒發的獲獎證書也為世界各著名計算機公司、各知名大學所認可。
該項競賽是年度性競賽,分區域預賽和國際決賽兩個階段進行,各預賽區第一名自動獲得參加世界決賽的資格,世界決賽安排在每年的3~4月舉行,而區域預賽安排在上一年的9月~12月在各大洲舉行。從1998年開始,IBM公司連續5年獨家贊助該項賽事的世界決賽和區域預賽。這項比賽是以大學為單位組隊(每支隊由教練、3名正式隊員,一名後備隊員組成)參賽,要求在5個小時內,解決5~8到題目。
ACM/ICPC的區域預賽是規模很大,范圍很廣的賽事,近幾年,全世界有1000多所大學, 2000多支參賽隊在六大洲的28~30個賽站中爭奪世界決賽的60~66個名額,去年我校舉辦的區域預賽,就有來自50多所高校的100多支隊伍參加,其激烈程度可想而知。
與其他編程競賽相比,ACM/ICPC題目難度更大,更強調演算法的高效性,不僅要解決一個指定的命題,而且必需要以最佳的方式解決指定的命題;它涉及知識面廣,與大學計算機系本科以及研究生如程序設計、離散數學、數據結構、人工智慧、演算法分析與設計等相關課程直接關聯,對數學要求更高,由於採用英文命題,對英語要求高,ACM/ICPC採用3人合作、共用一台電腦,所以它更強調團隊協作精神;由於許多題目並無現成的演算法,需要具備創新的精神,ACM/ICPC不僅強調學科的基礎,更強調全面素質和能力的培養。ACM/ICPC是一種全封閉式的競賽,能對學生能力進行實時的全面的考察,其成績的真實性更強,所以目前已成為內地高校的一個熱點,是培養全面發展優秀人材的一項重要的活動。概括來說就是:強調演算法的高效性、知識面要廣、對數學和英語要求較高、團隊協作和創新精神。
3.ACM需要那些方面的知識
一、語言是最重要的基本功 無論側重於什麼方面,只要是通過計算機程序去最終實現的競賽,語言都是大家要 過的第一道關。
亞洲賽區的比賽支持的語言包括C/C++與JAVA。筆者首先說說JAVA,眾所 周知,作為面向對象的王牌語言,JAVA在大型工程的組織與安全性方面有著自己獨特的 優勢,但是對於信息學比賽的具體場合,JAVA則顯得不那麼合適,它對於輸入輸出流的 操作相比於C++要繁雜很多,更為重要的是JAVA程序的運行速度要比C++慢10倍以上,而 競賽中對於JAVA程序的運行時限卻往往得不到同等比例的放寬,這無疑對演算法設計提出 了更高的要求,是相當不利的。
其實,筆者並不主張大家在這種場合過多地運用面向對 象的程序設計思維,因為對於小程序來說這不旦需要花費更多的時間去編寫代碼,也會 降低程序的執行效率。 接著說C和C++。
許多現在參加講座的同學還在上大一,C的基礎知識剛剛學完,還沒 有接觸過C++,其實在賽場上使用純C的選手還是大有人在的,它們主要是看重了純C在效 率上的優勢,所以這部分同學如果時間有限,並不需要急著去學習新的語言,只要提高 了自己在演算法設計上的造詣,純C一樣能發揮巨大的威力。 而C++相對於C,在輸入輸出流上的封裝大大方便了我們的操作,同時降低了出錯的 可能性,並且能夠很好地實現標准流與文件流的切換,方便了調試的工作。
如果有些同 學比較在意這點,可以嘗試C和C++的混編,畢竟僅僅學習C++的流操作還是不花什麼時間 的。 C++的另一個支持來源於標准模版庫(STL),庫中提供的對於基本數據結構的統一 介面操作和基本演算法的實現可以縮減我們編寫代碼的長度,這可以節省一些時間。
但是 ,與此相對的,使用STL要在效率上做出一些犧牲,對於輸入規模很大的題目,有時候必 須放棄STL,這意味著我們不能存在「有了STL就可以不去管基本演算法的實現」的想法; 另外,熟練和恰當地使用STL必須經過一定時間的積累,准確地了解各種操作的時間復雜 度,切忌對STL中不熟悉的部分濫用,因為這其中蘊涵著許多初學者不易發現的陷阱。 通過以上的分析,我們可以看出僅就信息學競賽而言,對語言的掌握並不要求十分 全面,但是對於經常用到的部分,必須十分熟練,不允許有半點不清楚的地方,下面我 舉個真實的例子來說明這個道理——即使是一點很細微的語言障礙,都有可能釀成錯誤 : 在去年清華的賽區上,有一個隊在做F題的時候使用了cout和printf的混合輸出,由 於一個帶緩沖一個不帶,所以輸出一長就混亂了。
只是因為當時judge team中負責F題的 人眼睛尖,看出答案沒錯只是順序不對(答案有一頁多,是所有題目中最長的一個輸出 ),又看了看程序發現只是輸出問題就給了個Presentation error(格式錯)。如果審 題的人不是這樣而是直接給一個 Wrong Answer,相信這個隊是很難查到自己錯在什麼地 方的。
現在我們轉入第二個方面的討論,基礎學科知識的積累。 二、以數學為主的基礎知識十分重要 雖然被定性為程序設計競賽,但是參賽選手所遇到的問題更多的是沒有解決問題的 思路,而不是有了思路卻死活不能實現,這就是平時積累的基礎知識不夠。
今年World Final的總冠軍是波蘭華沙大學,其成員出自於數學系而非計算機系,這就是一個鮮活的 例子。競賽中對於基礎學科的涉及主要集中於數學,此外對於物理、電路等等也可能有 一定應用,但是不多。
因此,大一的同學也不必為自己還沒學數據結構而感到不知從何 入手提高,把數學撿起來吧!下面我來談談在競賽中應用的數學的主要分支。 1、離散數學——作為計算機學科的基礎,離散數學是競賽中涉及最多的數學分支, 其重中之重又在於圖論和組合數學,尤其是圖論。
圖論之所以運用最多是因為它的變化最多,而且可以輕易地結合基本數據結構和許 多演算法的基本思想,較多用到的知識包括連通性判斷、DFS和BFS,關節點和關鍵路徑、歐拉迴路、最小生成樹、最短路徑、二部圖匹配和網路流等等。雖然這部分的比重很大 ,但是往往也是競賽中的難題所在,如果有初學者對於這部分的某些具體內容暫時感到 力不從心,也不必著急,可以慢慢積累。
競賽中設計的組合計數問題大都需要用組合數學來解決,組合數學中的知識相比於 圖論要簡單一些,很多知識對於小學上過奧校的同學來說已經十分熟悉,但是也有一些 部分需要先對代數結構中的群論有初步了解才能進行學習。組合數學在競賽中很少以難 題的形式出現,但是如果積累不夠,任何一道這方面的題目卻都有可能成為難題。
2、數論——以素數判斷和同餘為模型構造出來的題目往往需要較多的數論知識來解 決,這部分在競賽中的比重並不大,但只要來上一道,也足以使知識不足的人冥思苦想 上一陣時間。素數判斷和同餘最常見的是在以密碼學為背景的題目中出現,在運用密碼 學常識確定大概的過程之後,核心演算法往往要涉及數論的內容。
3、計算幾何——計算幾何相比於其它部分來說是比較獨立的,就是說它和其它的知 識點很少有過多的結合,較常用到的部分包括——線段相交的判斷、多邊形面積的計算 、內點外點的判斷、凸包等。
4.ACM需要那些方面的知識
一、語言是最重要的基本功 無論側重於什麼方面,只要是通過計算機程序去最終實現的競賽,語言都是大家要 過的第一道關。
亞洲賽區的比賽支持的語言包括C/C++與JAVA。筆者首先說說JAVA,眾所 周知,作為面向對象的王牌語言,JAVA在大型工程的組織與安全性方面有著自己獨特的 優勢,但是對於信息學比賽的具體場合,JAVA則顯得不那麼合適,它對於輸入輸出流的 操作相比於C++要繁雜很多,更為重要的是JAVA程序的運行速度要比C++慢10倍以上,而 競賽中對於JAVA程序的運行時限卻往往得不到同等比例的放寬,這無疑對演算法設計提出 了更高的要求,是相當不利的。
其實,筆者並不主張大家在這種場合過多地運用面向對 象的程序設計思維,因為對於小程序來說這不旦需要花費更多的時間去編寫代碼,也會 降低程序的執行效率。 接著說C和C++。
許多現在參加講座的同學還在上大一,C的基礎知識剛剛學完,還沒 有接觸過C++,其實在賽場上使用純C的選手還是大有人在的,它們主要是看重了純C在效 率上的優勢,所以這部分同學如果時間有限,並不需要急著去學習新的語言,只要提高 了自己在演算法設計上的造詣,純C一樣能發揮巨大的威力。 而C++相對於C,在輸入輸出流上的封裝大大方便了我們的操作,同時降低了出錯的 可能性,並且能夠很好地實現標准流與文件流的切換,方便了調試的工作。
如果有些同 學比較在意這點,可以嘗試C和C++的混編,畢竟僅僅學習C++的流操作還是不花什麼時間 的。 C++的另一個支持來源於標准模版庫(STL),庫中提供的對於基本數據結構的統一 介面操作和基本演算法的實現可以縮減我們編寫代碼的長度,這可以節省一些時間。
但是 ,與此相對的,使用STL要在效率上做出一些犧牲,對於輸入規模很大的題目,有時候必 須放棄STL,這意味著我們不能存在「有了STL就可以不去管基本演算法的實現」的想法; 另外,熟練和恰當地使用STL必須經過一定時間的積累,准確地了解各種操作的時間復雜 度,切忌對STL中不熟悉的部分濫用,因為這其中蘊涵著許多初學者不易發現的陷阱。 通過以上的分析,我們可以看出僅就信息學競賽而言,對語言的掌握並不要求十分 全面,但是對於經常用到的部分,必須十分熟練,不允許有半點不清楚的地方,下面我 舉個真實的例子來說明這個道理——即使是一點很細微的語言障礙,都有可能釀成錯誤 : 在去年清華的賽區上,有一個隊在做F題的時候使用了cout和printf的混合輸出,由 於一個帶緩沖一個不帶,所以輸出一長就混亂了。
只是因為當時judge team中負責F題的 人眼睛尖,看出答案沒錯只是順序不對(答案有一頁多,是所有題目中最長的一個輸出 ),又看了看程序發現只是輸出問題就給了個Presentation error(格式錯)。如果審 題的人不是這樣而是直接給一個 Wrong Answer,相信這個隊是很難查到自己錯在什麼地 方的。
現在我們轉入第二個方面的討論,基礎學科知識的積累。 二、以數學為主的基礎知識十分重要 雖然被定性為程序設計競賽,但是參賽選手所遇到的問題更多的是沒有解決問題的 思路,而不是有了思路卻死活不能實現,這就是平時積累的基礎知識不夠。
今年World Final的總冠軍是波蘭華沙大學,其成員出自於數學系而非計算機系,這就是一個鮮活的 例子。競賽中對於基礎學科的涉及主要集中於數學,此外對於物理、電路等等也可能有 一定應用,但是不多。
因此,大一的同學也不必為自己還沒學數據結構而感到不知從何 入手提高,把數學撿起來吧!下面我來談談在競賽中應用的數學的主要分支。 1、離散數學——作為計算機學科的基礎,離散數學是競賽中涉及最多的數學分支, 其重中之重又在於圖論和組合數學,尤其是圖論。
圖論之所以運用最多是因為它的變化最多,而且可以輕易地結合基本數據結構和許 多演算法的基本思想,較多用到的知識包括連通性判斷、DFS和BFS,關節點和關鍵路徑、歐拉迴路、最小生成樹、最短路徑、二部圖匹配和網路流等等。雖然這部分的比重很大 ,但是往往也是競賽中的難題所在,如果有初學者對於這部分的某些具體內容暫時感到 力不從心,也不必著急,可以慢慢積累。
競賽中設計的組合計數問題大都需要用組合數學來解決,組合數學中的知識相比於 圖論要簡單一些,很多知識對於小學上過奧校的同學來說已經十分熟悉,但是也有一些 部分需要先對代數結構中的群論有初步了解才能進行學習。組合數學在競賽中很少以難 題的形式出現,但是如果積累不夠,任何一道這方面的題目卻都有可能成為難題。
2、數論——以素數判斷和同餘為模型構造出來的題目往往需要較多的數論知識來解 決,這部分在競賽中的比重並不大,但只要來上一道,也足以使知識不足的人冥思苦想 上一陣時間。素數判斷和同餘最常見的是在以密碼學為背景的題目中出現,在運用密碼 學常識確定大概的過程之後,核心演算法往往要涉及數論的內容。
3、計算幾何——計算幾何相比於其它部分來說是比較獨立的,就是說它和其它的知 識點很少有過多的結合,較常用到的部分包括——線段相交的判斷、多邊形面積的計算 、內點外點的判斷、凸包等。
5.ACM需要具備什麼知識
ACM國際大學生程序設計競賽(ACM/ICPC :ACM International Collegiate Programming Contest)是由國際計算機界歷史悠久、頗具權威性的組織ACM( 美國計算機協會)學會(Association for puter Machineary)主辦,是世界上公認的規模最大、水平最高的國際大學生程序設計競賽,其目的旨在使大學生運用計算機來充分展示自已分析問題和解決問題的能力。該項競賽從1970年舉辦至今已歷25屆,因歷屆競賽都薈萃了世界各大洲的精英,雲集了計算機界的「希望之星」,而受到國際各知名大學的重視,並受到全世界各著名計算機公司如Microsoft(微軟公司) 、IBM等的高度關注,成為世界各國大學生最具影響力的國際級計算機類的賽事,ACM所頒發的獲獎證書也為世界各著名計算機公司、各知名大學所認可。
該項競賽是年度性競賽,分區域預賽和國際決賽兩個階段進行,各預賽區第一名自動獲得參加世界決賽的資格,世界決賽安排在每年的3~4月舉行,而區域預賽安排在上一年的9月~12月在各大洲舉行。從1998年開始,IBM公司連續5年獨家贊助該項賽事的世界決賽和區域預賽。這項比賽是以大學為單位組隊(每支隊由教練、3名正式隊員,一名後備隊員組成)參賽,要求在5個小時內,解決5~8到題目。
ACM/ICPC的區域預賽是規模很大,范圍很廣的賽事,近幾年,全世界有1000多所大學, 2000多支參賽隊在六大洲的28~30個賽站中爭奪世界決賽的60~66個名額,去年我校舉辦的區域預賽,就有來自50多所高校的100多支隊伍參加,其激烈程度可想而知。
與其他編程競賽相比,ACM/ICPC題目難度更大,更強調演算法的高效性,不僅要解決一個指定的命題,而且必需要以最佳的方式解決指定的命題;它涉及知識面廣,與大學計算機系本科以及研究生如程序設計、離散數學、數據結構、人工智慧、演算法分析與設計等相關課程直接關聯,對數學要求更高,由於採用英文命題,對英語要求高,ACM/ICPC採用3人合作、共用一台電腦,所以它更強調團隊協作精神;由於許多題目並無現成的演算法,需要具備創新的精神,ACM/ICPC不僅強調學科的基礎,更強調全面素質和能力的培養。ACM/ICPC是一種全封閉式的競賽,能對學生能力進行實時的全面的考察,其成績的真實性更強,所以目前已成為內地高校的一個熱點,是培養全面發展優秀人材的一項重要的活動。概括來說就是:強調演算法的高效性、知識面要廣、對數學和英語要求較高、團隊協作和創新精神。
6.ACM常用的經典演算法
大概分為數論演算法,圖論演算法,A*演算法。
數論演算法:
排序(選擇,冒泡,快速,歸並,堆,基數,桶排序等)
遞歸,回溯
概率,隨機
公約數,素數
因數分解
矩陣運算
線性規劃
最小二乘
微積分
多項式分解和級數
圖論演算法:
哈夫曼樹(即最優二叉樹)
哈希表
Prim,Kruskal演算法(即最小生成樹演算法)
紅黑樹
a-B剪枝法
深、廣度搜索
拓撲排序
強連通分量
Dijkstra,Bellman-Ford,Floyd-Warashall演算法(最短路徑演算法)
計算幾何(線段相交,凸包,最近點對)
A*演算法:
動態規劃
貪心演算法
KMP演算法
哈密頓迴路問題
子集問題
博弈(極大極小值演算法等)
7.參加ACM需要准備哪些知識
學ACM要熟練C語言的基礎語法,對編程有很大的興趣,還要學關於數據結構的知識。
內容大多數是考數據結構,例如:深度搜索(dfs)、廣度搜索(bfs)、並查集、母函數、最小生成樹、數論、動態規劃(重點)、背包問題、最短路、網路流……還有很多演算法,我列出這些是經常考到的,我也在學習上述所說的。 最好買一本《數據結構》或者關於演算法的書看看,看完一些要自己動手實踐做題,做題的話去杭電acm做題,裡面有很多很基礎的題,不錯的。
資料的話,網路有很多,我多數都是網路或者 *** ,還有可以看看別人的博客的解題報告,裡面有詳細的介紹,不懂還可以問問同學師兄的。 對了,還有一點,acm比賽都是英文題目的,比賽時帶本字典查吧。
希望我說的你能滿意,祝你能在acm方面有所收獲。
『捌』 動態規劃中控制和預測部分的區別是
自適應動態規劃(Adaptive/Approximate Dynamic Programming,ADP),又叫近似動態規劃,是人工智慧和控制領域發展而交匯形成的新興學科。ADP方法主要包括三種基本類型:啟發式動態規劃(Heuristic Dynamic Programming,HDP),雙啟發式動態規劃(Dual Heuristic Programming,DHP)和全局雙啟發式動態規劃(Globalized Dual heuristic Programming,GDHP)。這三種類型都包含三個模塊,如果每個模塊都用神經網路來代替,這樣我們也稱這三個模塊為三個網路,即評價網路(Critic Network)、模型網路(Model Network)和執行網路(Action Network)。如果我們省略了模型網路,使得執行網路直接與評價網路鏈隱相連接,這樣的結構稱棚灶廳為它們的動作依賴(Action-Dependent)形式,即ADHDP,ADDHP,ADGDHP。 ADP一般包括三個部分:動態系統(dynamic system)、評價執行函數(critic performance index function) 環節、執行/控制(action/control)環節,每個環節均可由神經網路來代替。其中動態系統(或稱為被控對象)對應於建立的模型,執行/控制環節用來近似最優控制策略,評價執行函數環節是基於Bellman最優性原理進行參數更新,評價網路和執行網路的組合成了一個智能體。執行/控製作用於動態系統, 評價執行函數由動態系統產生獎勵或是懲罰作用來影響。執行/控制環節輸出控制動作,評價執行函數的輸出是基於貝爾曼最優性原理的代價函數值,即以輸出代價函數值最小為目標調整執行/控制環節使其輸出動作近似最優。動態預測是一種透過運動矢辯餘量來描述一張2D圖片是如何轉換成另外一張2D圖片的程序。在視頻處理時,圖片指的就是鄰近的畫格。這些運動矢量可以想成是3D空間(2D+時域)投影到2D的結果。對一張圖片而言,可以給每一個像素創建一個獨特的運動矢量,也可以將鄰近的像素聚集成一個區塊,並只計算每一個區塊的運動矢量。運動矢量的數學模型可以是單純的平移也可以含括例如3D空間的的轉動和縮放等幾何運動方式來更妥當地模擬真實攝影機的動態。動態預測和光流法常常被互相混用。它同時也與圖像配准和立體匹配有關。事實上上述幾種詞彙都是在找尋兩張圖片或視頻畫格間相對應的點。兩圖片或畫格間相對應的點「通常」是該場景中的同一個點。然而,在作動態預測之前,我們必須定義相似性的比較標准。也就是說,我們需要一個尺度來測量兩個點之間的相似程度。在相關領域的研究中,被定義了各種比較標准,像是SAD、MSE,隨不同應用和優化需要常常會使用不同的比較標准。