借助舊問題回顧動態規劃

2021-07-05 17:16:19 字數 1661 閱讀 4235

一切要從乙個問題說起,聽說那是一道簡單的動態規劃題,於是我在半夜試著寫寫,誰知道到了第二天也沒有寫出來,看著45%的ac率,我想自己的動態規劃已經忘得差不多了(呵呵,應該說沒有學好)

原問題:

hdu 1466 計算直線的交點數(經典dp)

平面上有n條直線,且無三線共點,問這些直線能有多少種不同交點數。

比如,如果n=2,則可能的交點數量為0(平行)或者1(不平行)。

分析:變化的根源在於有某些直線是平行的,所有不斷產生新的結果(不是單純的遞推得到所有的結果)。對於a條直線,如果有r條直線是相互平行的,那麼它相對於i-r直線集合的而言新增加的交點數目就是(i-r)*r。於是得到狀態轉移式子:if(dp[r][j])  dp[i][(i-r)*r+j]=1; 

如果r條直線的交點情況存在【即全部平行或m個交點】,那麼可以用它來討論平行線相交。後面直線集合的多種平**況可以由這樣的狀態轉移一次次的算出來。

附上自製:

相似問題:

hdu 1257 最少攔截系統(貪心)

相關部落格:

本題變化:「輸出資料只有一行,該行包含兩個資料,之間用半形逗號隔開。第乙個資料表示這套系統最多能攔截的飛彈數;第二個資料表示若要攔截所有飛彈至少要再新增多少套這樣的系統。」

最長不公升子串行長度——第一問答案,使用dp:

}return 0;

}vijos p1122出棧序列統計 (catalan數 | dp)

棧是常用的一種資料結構,有n令元素在棧頂端一側等待進棧,棧頂端另一側是出棧序 列。你已經知道棧的操作有兩·種:push和pop,前者是將乙個元素進棧,後者是將棧頂元素彈出。現在要使用這兩種操作,由乙個操作序列可以得到一系列 的輸出序列。請你程式設計求出對於給定的n,計算並輸出由運算元序列1,2,…,n,經過一系列操作可能得到的輸出序列總數。

分析:按照在某乙個時刻的彈出情況,數字要麼彈出,要麼不彈出,所以有6種情況才對,4的話結果應該是6*4=24.(隔板)然而情況卻不是這樣,因為不存在3,1,2這樣的結果,如果3先彈出,那麼1,2全部先壓進棧了才對,所以只有3,2,1。通過"壓入"暫時看不出遞推式,因為我們子問題的結果是彈出的結果數,所以也應該向彈出的情況發展思考,剛剛考慮的是第乙個出來的數字,現在想想最後乙個出來的數字,設它是i,那麼比它小的數字1——i-1在它之前要彈出,比它大的數字也要先彈出,於是結果出來了:

#include #include usingnamespacestd;

int f[20];

int main()

}int n;

while(cin>>n)

return0;

}

但是後來聽別人說這是catalan數,又漲姿勢了。。catalan數的另一種遞推形式:

回顧動態規劃

對於動態規劃,一直感覺會了,但又不怎麼會,難點的題也做不到自己完成,今天再總結一下 首先動態規劃到底是幹啥的?現在想來,應該是用陣列記錄遞迴中的結果 第一次接觸動態規劃就是斐波那契了吧 然後動態規劃要做到每次選最佳方案 opt 對一陣列,選擇不相鄰的數,使其相加所得和最大 計算opt i opt 0...

動態規劃問題

思想 如果乙個問題是由交疊的子問題所構成,那麼我們就可以用動態規劃技術來解決它。一般來說,這樣的子問題出現在對給定問題求解的遞迴關係中。這個遞推關係包含了相 同問題的更小子問題的解。動態規劃法建議,與其對交疊子問題一次又一次的求解,不如把每個較小子問題只求解一次並把結果記錄在表中。例題 0 1揹包問...

動態規劃問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 ctest有n個蘋果,要將它放入容量為v的揹包。給出第i個蘋果的大小和價錢,求出能放入揹包的蘋果的總價錢最大值。輸入 有多組測試資料,每組測試資料第一行為2個正整數,分別代表蘋果的個數n和揹包的容量v,n v同時為0時結束測試,...