動態規劃初學

2021-07-28 21:42:21 字數 1064 閱讀 9845

繼續開始學習演算法=_=!

開始自學動態規劃,寫了乙個石子問題的乙個demo。當然這其中借鑑了很多很多大神部落格的幫助,在此就不說了。開始正題!

什麼是動態規劃,我理解的是每一步走都是選取最優的,萬能公式(就是狀態轉化公式)的思想很簡單,要知道題目約束,比如經典的揹包問題就是一定的揹包容量k,可供選擇的物品,物品有重量w和**c,問怎樣才能在容量k的揹包內裝入最大**的東西。可以這麼想:質量由小增大,選擇的物品也是數量開始增加,開始質量為1個單位時,從一號物品開始考慮,接著考慮1、2號,接著考慮1,2,3號物品。。。當質量為j,物品考慮到n號(前n個物品都可以選擇)此時的最優解應該是在(1)、拿第n個物品的**+質量為(j-n號質量)時候選擇的最優解的**,(2)、不拿n個物品,只拿前n-1個物品滿足質量j的**。1、2選擇最大的就是當前的最優解,再解釋一下,就是要不要選擇當前的物品——判斷選擇好還是不選擇好。

下面是乙個石子問題的程式:題目大意是有n堆石子,相鄰石碓之間可以合成一堆,合成的代價是合成一堆後的數量。問將這n個石碓合成一堆的最小代價是多少。

可以這麼想,合n堆是從合n-1堆轉來的,所以考慮合成堆數從2到n-1,當確定合成堆數v時,考慮閤第i堆到第v+i堆的最優解,對於這個最優解的計算是:i到v+i間,因為最後一次合的話是合相鄰堆,那麼就將這v堆分成相鄰的兩部分然後求代價最小加上這v堆的總量就是此次的最小的代價。

#include 

#include

#include

const

int inf=1

<<30;

const

int n=201;

int a[n],sum[n],dp[n][n];//dp[i][j]表示從i到j的最優合併值

using

namespace

std;

//石子問題

int minm(int a,int b);

int merges(int a,int n)

}}return dp[0][n-1];

}int minm(int a,int b)

int main()

初學動態規劃

1 動態規劃定義 動態規劃 動態規則可用於解最優解的問題,其基本思想為把乙個大的問題分析小的子問題,並記錄每個子問題的結果,再通過這些子問題的解能解出最終的結果。應用於重疊子問題的問題。步驟 1 把乙個問題分解成好的子問題。2 對每個子問題求解並記錄下每個子問題的結果。例一 poj 2533 思路 ...

初學演算法 動態規劃之滾動陣列

魅力手鐲 描述 貝西去了購物中心的珠寶店,發現了乙個迷人的手鐲。當然,她想用n 1 中可能的最佳魅力來填充它 n 3402 可用的護身符。所提供列表中的每個咒語都有乙個權重wi 1 wi 400 乙個 可取性 因子di 1 di 100 最多可使用一次。貝西只能支援重量不超過m 1 的魅力手鐲 m ...

動態規劃 什麼是動態規劃?

先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...