(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版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...