先給出別人的總結(jié)??:
遞歸到動規(guī)的一般轉(zhuǎn)化方法
遞歸函數(shù)有n個參數(shù),就定義一個n維的數(shù)組屋吨,數(shù)組的下標(biāo)是遞歸函數(shù)參數(shù)的取值范圍门粪,數(shù)組元素的值是遞歸函數(shù)的返回值,這樣就可以從邊界值開始椰拒, 逐步填充數(shù)組,相當(dāng)于計算遞歸函數(shù)值的逆過程凰荚。
動規(guī)解題的一般思路
1. 將原問題分解為子問題
把原問題分解為若干個子問題燃观,子問題和原問題形式相同或類似,只不過規(guī)模變小了便瑟。子問題都解決缆毁,原問題即解決(數(shù)字三角形例)。子問題的解一旦求出就會被保存到涂,所以每個子問題只需求 解一次脊框。
2.確定狀態(tài)
在用動態(tài)規(guī)劃解題時,我們往往將和子問題相關(guān)的各個變量的一組取值践啄,稱之為一個“狀 態(tài)”浇雹。一個“狀態(tài)”對應(yīng)于一個或多個子問題, 所謂某個“狀態(tài)”下的“值”往核,就是這個“狀 態(tài)”所對應(yīng)的子問題的解箫爷。
所有“狀態(tài)”的集合,構(gòu)成問題的“狀態(tài)空間”聂儒』⒚“狀態(tài)空間”的大小,與用動態(tài)規(guī)劃解決問題的時間復(fù)雜度直接相關(guān)衩婚。 在數(shù)字三角形的例子里窜护,一共有N×(N+1)/2個數(shù)字,所以這個問題的狀態(tài)空間里一共就有N×(N+1)/2個狀態(tài)非春。
整個問題的時間復(fù)雜度是狀態(tài)數(shù)目乘以計算每個狀態(tài)所需時間柱徙。在數(shù)字三角形里每個“狀態(tài)”只需要經(jīng)過一次恨狈,且在每個狀態(tài)上作計算所花的時間都是和N無關(guān)的常數(shù)唉韭。
3.確定一些初始狀態(tài)(邊界狀態(tài))的值
以“數(shù)字三角形”為例,初始狀態(tài)就是底邊數(shù)字吃挑,值就是底邊數(shù)字值储耐。
4. 確定狀態(tài)轉(zhuǎn)移方程
定義出什么是“狀態(tài)”羊初,以及在該“狀態(tài)”下的“值”后,就要找出不同的狀態(tài)之間如何遷移――即如何從一個或多個“值”已知的 “狀態(tài)”,求出另一個“狀態(tài)”的“值”(遞推型)长赞。狀態(tài)的遷移可以用遞推公式表示晦攒,此遞推公式也可被稱作“狀態(tài)轉(zhuǎn)移方程”。
能用動規(guī)解決的問題的特點
1) 問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)得哆。如果問題的最優(yōu)解所包含的 子問題的解也是最優(yōu)的脯颜,我們就稱該問題具有最優(yōu)子結(jié) 構(gòu)性質(zhì)。
2) 無后效性贩据。當(dāng)前的若干個狀態(tài)值一旦確定栋操,則此后過程的演變就只和這若干個狀態(tài)的值有關(guān),和之前是采取哪種手段或經(jīng)過哪條路徑演變到當(dāng)前的這若干個狀態(tài)乐设,沒有關(guān)系讼庇。
另外給出oc代碼傳送門,但是總感覺如果用c寫的話更加簡便近尚。
這次算法給我的經(jīng)驗就是:遇到算法問題,先想想解決問題的數(shù)學(xué)方法场勤,不要急著寫代碼戈锻,可以用草稿本先寫寫,如果確定是可以實現(xiàn)的時候和媳,再去用代碼實現(xiàn)格遭。如果代碼實現(xiàn)了,再看看是不是有更優(yōu)的解決方案留瞳,或者自己的代碼是不是有可以優(yōu)化的地方拒迅。爭取做到最好!動態(tài)規(guī)劃 我還會繼續(xù)下去她倘,看看中篇璧微,高級篇,路漫漫其修遠兮硬梁,看來我要一步一步的爬前硫,沒辦法天生沒有“腳”。