初學動態規劃

2021-06-12 23:27:50 字數 1681 閱讀 2898

(1)動態規劃定義

動態規劃:動態規則可用於解最優解的問題,其基本思想為把乙個大的問題分析小的子問題,並記錄每個子問題的結果,再通過這些子問題的解能解出最終的結果。應用於重疊子問題的問題。

步驟:1 把乙個問題分解成好的子問題。 2 對每個子問題求解並記錄下每個子問題的結果。

例一:poj 2533

思路:動態規劃思想,把每乙個數看做乙個「動態」,把這個「動態」看作是序列的結尾算出此時的遞增子串行的長度並記錄下來。則所有這些遞增子串行中最長的就是所求的。

**://思路:把每乙個數當做乙個狀態,並記錄每個數的最長的上公升子串行,當讀取到乙個新數時,如果這個新的數比前面的某個數小

//並且+1之後比所有的子串行的長度都長,那麼這個子串行就是目前的最長子序列,直到序列的結束。

#include#includeusing namespace std;

int main()

cout<

例二: 杭電acm 4502題

把每天看成乙個動態,計算每天最多能賺多少。

**://dp,子問題劃分以每天的截止時間為子問題

#include#include#include#includeusing namespace std;

struct node

;int cmp(const node &a,const node &b)

memset(sum,0,sizeof(sum));

sort(job,job+n,cmp);

for(i=1;i<=m;i++)

else

sum[i]=sum[i]>sum[job[j].beg-1]+job[j].money?sum[i-1]:sum[job[j].beg-1]+job[j].money;}}

} cout《例三:杭電acm 4508

思想:把每個熱量當成「狀態」,則把子狀態劃分了。

**://動態規則

#include#includeusing namespace std;

struct node

;int main()

int need;

cin>>need;

for(i=0;i<=need;i++)

sum[now][i]=0;

int tag;

int temp;

for(i=1;i<=n;i++)

}} int max=0;

for(i=1;i<=need;i++)

if(sum[now][i]>max)

max=sum[now][i];

cout《例四:杭電4501

思路:這個題目當資料量小的時候才能用dp,否則執行量太大

**://動態規劃——買年貨

#include#include#include#include#includeusing namespace std;

#define max(a,b) (a>b?a:b);

struct node

;int main()

}} int big=0;

for(j=0;j<=v1money;j++)

for(k=0;k<=v2record;k++)

for(h=0;h<=kfree;h++)

if(sum[now][j][k][h]>big)

big=sum[now][j][k][h];

cout<

動態規劃初學

繼續開始學習演算法 開始自學動態規劃,寫了乙個石子問題的乙個 當然這其中借鑑了很多很多大神部落格的幫助,在此就不說了。開始正題!什麼是動態規劃,我理解的是每一步走都是選取最優的,萬能公式 就是狀態轉化公式 的思想很簡單,要知道題目約束,比如經典的揹包問題就是一定的揹包容量 可供選擇的物品,物品有重量...

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

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

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

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