動態規劃講解大全(含例題及答案)_第1頁
動態規劃講解大全(含例題及答案)_第2頁
動態規劃講解大全(含例題及答案)_第3頁
動態規劃講解大全(含例題及答案)_第4頁
動態規劃講解大全(含例題及答案)_第5頁
已閱讀5頁,還剩8頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、動態規劃講解大全動態規劃(dynamicprogramming)是運籌學的一個分支,是求解決策過程(decisionprocess)最優化的數學方法。20世紀50年代初美國數學家R.E.Bellman等人在研究多階段決策過程(multistepdecisionprocess)的優化問題時,提出了著名的最優化原理(principleofoptimality),把多階段過程轉化為一系列單階段問題,逐個求解,創立了解決這類過程優化問題的新方法動態規劃。1957年出版了他的名著DynamicProgramming,這是該領域的第一本著作。動態規劃問世以來,在經濟管理、生產調度、工程技術和最優控制等方面

2、得到了廣泛的應用。例如最短路線、庫存管理、資源分配、設備更新、排序、裝載等問題,用動態規劃方法比用其它方法求解更為方便。雖然動態規劃主要用于求解以時間劃分階段的動態過程的優化問題,但是一些與時間無關的靜態規劃(如線性規劃、非線性規劃),只要人為地引進時間因素,把它視為多階段決策過程,也可以用動態規劃方法方便地求解。動態規劃程序設計是對解最優化問題的一種途徑、一種方法,而不是一種特殊算法。不象前面所述的那些搜索或數值計算那樣,具有一個標準的數學表達式和明確清晰的解題方法。動態規劃程序設計往往是針對一種最優化問題,由于各種問題的性質不同,確定最優解的條件也互不相同,因而動態規劃的設計方法對不同的問

3、題,有各具特色的解題方法,而不存在一種萬能的動態規劃算法,可以解決各類最優化問題。因此讀者在學習時,除了要對基本概念和方法正確理解外,必須具體問題具體分析處理,以豐富的想象力去建立模型,用創造性的技巧去求解。我們也可以通過對若干有代表性的問題的動態規劃算法進行分析、討論,逐漸學會并掌握這一設計方法。基本模型多階段決策過程的最優化問題。在現實生活中,有一類活動的過程,由于它的特殊性,可將過程分成若干個互相聯系的階段,在它的每一階段都需要作出決策,從而使整個過程達到最好的活動效果。當然,各個階段決策的選取不是任意確定的,它依賴于當前面臨的狀態,又影響以后的發展,當各個階段決策確定后,就組成一個決策

4、序列,因而也就確定了整個過程的一條活動路線,如圖所示:(看詞條圖)這種把一個問題看作是一個前后關聯具有鏈狀結構的多階段過程就稱為多階段決策過程,這種問題就稱為多階段決策問題。記憶化搜索給你一個數字三角形,形式如下:12 34 567 8910找出從第一層到最后一層的一條路,使得所經過的權值之和最小或者最大.無論對與新手還是老手,這都是再熟悉不過的題了,很容易地,我們寫出狀態轉移方程:f(i,j)=ai,j+minf(i+1,j),f(i+1,j+1)對于動態規劃算法解決這個問題,我們根據狀態轉移方程和狀態轉移方向,比較容易地寫出動態規劃的循環表示方法。但是,當狀態和轉移非常復雜的時候,也許寫出

5、循環式的動態規劃就不是那么簡單了。解決方法:我們嘗試從正面的思路去分析問題,如上例,不難得出一個非常簡單的遞歸過程:f1:=f(i-1,j+1);f2:=f(i-1,j);iff1>f2thenf:=f1+ai,jelsef:=f2+ai,j;顯而易見,這個算法就是最簡單的搜索算法。時間復雜度為2n,明顯是會超時的。分析一下搜索的過程,實際上,很多調用都是不必要的,也就是把產生過的最優狀態,又產生了一次。為了避免浪費,很顯然,我們存放一個opt數組:Opti,j-每產生一個f(i,j),將f(i,j)的值放入opt中,以后再次調用到f(i,j)的時候,直接從opti,j來取就可以了。于是

6、動態規劃的狀態轉移方程被直觀地表示出來了,這樣節省了思維的難度,減少了編程的技巧,而運行時間只是相差常數的復雜度,避免了動態規劃狀態轉移先后的問題,而且在相當多的情況下,遞歸算法能更好地避免浪費,在比賽中是非常實用的.狀態決策決策:當前狀態通過決策,回到了以前狀態.可見決策其實就是狀態之間的橋梁。而以前狀態也就決定了當前狀態的情況。數字三角形的決策就是選擇相鄰的兩個以前狀態的最優值。狀態:我們一般在動規的時候所用到的一些數組,也就是用來存儲每個狀態的最優值的。我們就從動態規劃的要訣,也就是核心部分“狀態”開始,來逐步了解動態規劃。有時候當前狀態確定后,以前狀態就已經確定,則無需枚舉.動態規劃算

7、法的應用一、動態規劃的概念近年來,涉及動態規劃的各種競賽題越來越多,每一年的NOI幾乎都至少有一道題目需要用動態規劃的方法來解決;而競賽對選手運用動態規劃知識的要求也越來越高,已經不再停留于簡單的遞推和建模上了。要了解動態規劃的概念,首先要知道什么是多階段決策問題。1 .多階段決策問題如果一類活動過程可以分為若干個互相聯系的階段,在每一個階段都需作出決策(采取措施),一個階段的決策確定以后,常常影響到下一個階段的決策,從而就完全確定了一個過程的活動路線,則稱它為多階段決策問題。各個階段的決策構成一個決策序列,稱為一個策略。每一個階段都有若干個決策可供選擇,因而就有許多策略供我們選取,對應于一個

8、策略可以確定活動的效果,這個效果可以用數量來確定。策略不同,效果也不同,多階段決策問題,就是要在可以選擇的那些策略中間,選取一個最優策略,使在預定的標準下達到最好的效果.2 .動態規劃問題中的術語階段:把所給求解問題的過程恰當地分成若干個相互聯系的階段,以便于求解,過程不同,階段數就可能不同.描述階段的變量稱為階段變量。在多數情況下,階段變量是離散的,用k表示。止匕外,也有階段變量是連續的情形。如果過程可以在任何時刻作出決策,且在任意兩個不同的時刻之間允許有無窮多個決策時,階段變量就是連續的。在前面的例子中,第一個階段就是點A,而第二個階段就是點A到點B,第三個階段是點B到點C,而第四個階段是

9、點C到點Do狀態:狀態表示每個階段開始面臨的自然狀況或客觀條件,它不以人們的主觀意志為轉移,也稱為不可控因素。在上面的例子中狀態就是某階段的出發位置,它既是該階段某路的起點,同時又是前一階段某支路的終點。在前面的例子中,第一個階段有一個狀態即A,而第二個階段有兩個狀態B1和B2,第三個階段是三個狀態C1,C2和C3,而第四個階段又是一個狀態Do過程的狀態通??梢杂靡粋€或一組數來描述,稱為狀態變量。一般,狀態是離散的,但有時為了方便也將狀態取成連續的。當然,在現實生活中,由于變量形式的限制,所有的狀態都是離散的,但從分析的觀點,有時將狀態作為連續的處理將會有很大的好處。止匕外,狀態可以有多個分量

10、(多維情形),因而用向量來代表;而且在每個階段的狀態維數可以不同。當過程按所有可能不同的方式發展時,過程各段的狀態變量將在某一確定的范圍內取值。狀態變量取值的集合稱為狀態集合。無后效性:我們要求狀態具有下面的性質:如果給定某一階段的狀態,則在這一階段以后過程的發展不受這階段以前各段狀態的影響,所有各階段都確定時,整個過程也就確定了。換句話說,過程的每一次實現可以用一個狀態序列表示,在前面的例子中每階段的狀態是該線路的始點,確定了這些點的序列,整個線路也就完全確定。從某一階段以后的線路開始,當這段的始點給定時,不受以前線路(所通過的點)的影響。狀態的這個性質意味著過程的歷史只能通過當前的狀態去影

11、響它的未來的發展,這個性質稱為無后效性。決策:一個階段的狀態給定以后,從該狀態演變到下一階段某個狀態的一種選擇(行動)稱為決策。在最優控制中,也稱為控制。在許多間題中,決策可以自然而然地表示為一個數或一組數。不同的決策對應著不同的數值。描述決策的變量稱決策變量,因狀態滿足無后效性,故在每個階段選擇決策時只需考慮當前的狀態而無須考慮過程的歷史。決策變量的范圍稱為允許決策集合。策略:由每個階段的決策組成的序列稱為策略。對于每一個實際的多階段決策過程,可供選取的策略有一定的范圍限制,這個范圍稱為允許策略集合。允許策略集合中達到最優效果的策略稱為最優策略。給定k階段狀態變量x(k)的值后,如果這一階段

12、的決策變量一經確定,第k+1階段的狀態變量x(k+1)也就完全確定,即x(k+1)的值隨x(k)和第k階段的決策u(k)的值變化而變化,那么可以把這一關系看成(x(k),u(k)與x(k+1)確定的對應關系,用x(k+1)=Tk(x(k),u(k)表示。這是從k階段到k+1階段的狀態轉移規律,稱為狀態轉移方程。最優性原理:作為整個過程的最優策略,它滿足:相對前面決策所形成的狀態而言,余下的子策略必然構成最優子策略D也是B1到D的最短路徑一事實正是如此,因此我們認為這個例子滿足最優性原理的要求。(C2<C2是A到C2的最短路徑,B1<B10D,這些點的選擇構成了這個例子的最優策略,根

13、據最優性原理,這個策略的每個子策略應是最優:ACC20B10最優性原理實際上是要求問題的最優策略的子策略也是最優。讓我們通過對前面的例子再分析來具體說明這一點:從A到D,我們知道,最短路徑是A動態規劃練習題USACO2.2SubsetSums題目如下:對于從1到N的連續整集合合,能劃分成兩個子集合,且保證每個集合的數字和是相等的。舉個例子,如果N=3,對于1,2,3能劃分成兩個子集合,他們每個的所有數字和是相等的:and1,2這是唯一一種分發(交換集合位置被認為是同一種劃分方案,因此不會增加劃分方案總數)如果N=7,有四種方法能劃分集合1,2,3,4,5,6,7,每一種分發的子集合各數字和是相

14、等的:1,6,7and2,3,4,5注1+6+7=2+3+4+52,5,7and1,3,4,63,4,7and1,2,5,61,2,4,7and3,5,6給出N,你的程序應該輸出劃分方案總數,如果不存在這樣的劃分方案,則輸出0。程序不能預存結果直接輸出。PROGRAMNAME:subsetINPUTFORMAT輸入文件只有一行,且只有一個整數NSAMPLEINPUT(filesubset.in)7OUTPUTFORMAT輸出劃分方案總數,如果不存在則輸出0。SAMPLEOUTPUT(filesubset.out)4參考程序如下:#include<fstream>usingnames

15、pacestd;constunsignedintMAX_SUM=1024;intn;unsignedlonglongintdynMAX_SUM;ifstreamfin("subset.in");ofstreamfout("subset.out");intmain()fin>>n;fin.close();ints=n*(n+1);if(s%4)fout<<0<<endl;fout.close();return;s/=4;inti,j;dyn0=1;for(i=1;i<=n;i+)for(j=s;j>=i;j-

16、)dynj+=dynj-i;fout<<(dyns/2)<<endl;fout.close();return0;USACO2.3LongestPrefix題目如下:在生物學中,一些生物的結構是用包含其要素的大寫字母序列來表示的。生物學家對于把長的序列分解成較短的(稱之為元素的)序列很感興趣。如果一個集合P中的元素可以通過串聯(允許重復;串聯,相當于Pascal中的“+”運算符)組成一個序列S,那么我們認為序列S可以分解為P中的元素。并不是所有的元素都必須出現。舉個例子,序列ABABACABAAB可以分解為下面集合中的元素:A,AB,BA,CA,BBC序列S的前面K個字符

17、稱作S中長度為K的前綴。設計一個程序,輸入一個元素集合以及一個大寫字母序列,計算這個序列最長的前綴的長度。PROGRAMNAME:prefixINPUTFORMAT輸入數據的開頭包括1.200個元素(長度為1.10)組成的集合,用連續的以空格分開的字符串表示。字母全部是大寫,數據可能不止一行。元素集合結束的標志是一個只包含一個“.”的行。集合中的元素沒有重復。接著是大寫字母序列S,長度為1.200,000,用一行或者多行的字符串來表示,每行不超過76個字符。換行符并不是序列S的一部分。SAMPLEINPUT(fileprefix.in)AABBACABBCABABACABAABCOUTPUTF

18、ORMAT只有一行,輸出一個整數,表示S能夠分解成P中元素的最長前綴的長度。SAMPLEOUTPUT(fileprefix.out)11示例程序如下:#include<stdio.h>#defineMAXP200#defineMAXL10charprimMAXP+1MAXL+1;intnump;intstart200001;chardata200000;intndata;intmain(intargc,char*argv)FILE*fout,*fin;intbest;intlv,lv2,lv3;if(fin=fopen("prim.in","r&quo

19、t;)=NULL)perror("fopenfin");exit(1);if(fout=fopen("prim.out","w")=NULL)perror("fopenfout");exit(1);while(1)fscanf(fin,"%s",primnump);if(primnump0!='.')nump+;elsebreak;ndata=0;while(fscanf(fin,"%s",data+ndata)=1)ndata+=strlen(data+nd

20、ata);start0=1;best=0;for(lv=0;lv<ndata;lv+)if(startlv)best=lv;for(lv2=0;lv2<nump;lv2+)for(lv3=0;lv+lv3<ndata&&primlv2lv3&&primlv2lv3=datalv+lv3;lv3+);if(!primlv2lv3)startlv+lv3=1;if(startndata)best=ndata;fprintf(fout,"%in",best);return0;USACO3.1ScoreInflation題目如下:我

21、們試著設計我們的競賽以便人們能盡可能的多得分,這需要你的幫助。我們可以從幾個種類中選取競賽的題目,這里的一個"種類"是指一個競賽題目的集合,解決集合中的題目需要相同多的時間并且能得到相同的分數。你的任務是寫一個程序來告訴USACO的職員,應該從每一個種類中選取多少題目,使得解決題目的總耗時在競賽規定的時間里并且總分最大。輸入包括競賽的時間,M(1<=M<=10,000)和N,"種類"的數目1<=N<=10,000。后面的每一行將包括兩個整數來描述一個"種類":第一個整數說明解決這種題目能得的分數(1<=p

22、oints<=10000),第二整數說明解決這種題(1<=minutes<=10000)。你的程序應該確定我們應該從每個"種類"中選多少道題目使得能在競賽的時間中得到最大的分數。來自任意的"種類"的題目數目可能任何非負數(0或更多)。計算可能得到的最大分數。PROGRAMNAME:inflateINPUTFORMAT第1行:M,N-競賽的時間和題目"種類"的數目。第2-N+1行:兩個整數:每個"種類"題目的分數和耗時。SAMPLEINPUT(fileinflate.in)3004100602501

23、201201003520OUTPUTFORMAT單獨的一行包括那個在給定的限制里可能得到的最大的分數。SAMPLEOUTPUT(fileinflate.out)605從第2個"種類"中選兩題,第4個"種類"中選三題示例程序如下:#include<fstream.h>ifstreamfin("inflate.in");ofstreamfout("inflate.out");constshortmaxm=10010;longbestmaxm,m,n;voidmain()shorti,j,len,pts;fi

24、n>>m>>n;for(j=0;j<=m;j+)bestj=0;for(i=0;i<n;i+)fin>>pts>>len;for(j=len;j<=m;j+)if(bestj-len+pts>bestj)bestj=bestj-len+pts;fout<<bestm<<endl;/由于數組元素不減,末元素最大USACO3.3AGame題目如下:有如下一個雙人游戲:N(2<=N<=100)個正整數的序列放在一個游戲平臺上,兩人輪流從序列的兩端取數,取數后該數字被去掉并累加到本玩家的得分中,

25、當數取盡時,游戲結束。以最終得分多者為勝。編一個執行最優策略的程序,最優策略就是使自己能得到在當前情況下最大的可能的總分的策略。你的程序要始終為第二位玩家執行最優策略。PROGRAMNAME:game1INPUTFORMAT第一行:正整數N,表示序列中正整數的個數。第二行至末尾:用空格分隔的N個正整數(大小為1-200)。SAMPLEINPUT(filegame1.in)6472952OUTPUTFORMAT只有一行,用空格分隔的兩個整數:依次為玩家一和玩家二最終的得分。SAMPLEOUTPUT(filegame1.out)1811參考程序如下:#include<stdio.h>#

26、defineNMAX101intbestNMAX2,tNMAX;intn;voidreadx()inti,aux;freopen("game1.in","r",stdin);scanf("%d",&n);for(i=1;i<=n;i+)scanf("%d",&aux);t=ti-1+aux;fclose(stdin);inlineintmin(intx,inty)returnx>y?y:x;voidsolve()inti,l;for(l=1;l<=n;l+)for(i=1;i+l&

27、lt;=n+1;i+)bestl%2=ti+l-1-ti-1-min(besti+1(l-1)%2,best(l-1)%2);voidwritex()freopen("game1.out","w",stdout);printf("%d%dn",best1n%2,tn-best1n%2);fclose(stdout);intmain()readx();solve();writex();return0;USACO3.4RaucousRockers題目如下:你剛剛得到了流行的“破鑼搖滾”樂隊錄制的尚未發表的N(1<=N<=20)

28、首歌的版權。你打算從中精選一些歌曲,發行M(1<=M<=20)張CD。每一張CD最多可以容納T(1<=T<=20)分鐘的音樂,一首歌不能分裝在兩張CD中。不巧你是一位古典音樂迷,不懂如何判定這些歌的藝術價值。于是你決定根據以下標準進行選擇:歌曲必須按照創作的時間順序在CD盤上出現。選中的歌曲數目盡可能地多。PROGRAMNAME:rockersINPUTFORMAT第一行:三個整數:N,T,M.第二行:N個整數,分別表示每首歌的長度,按創作時間順序排列。SAMPLEINPUT(filerockers.in)4524342OUTPUTFORMAT一個整數,表示可以裝進M張

29、CD盤的樂曲的最大數目。SAMPLEOUTPUT(filerockers.out)3參考程序如下:#include<stdio.h>#defineMAX25intdpMAXMAXMAX,lengthMAX;intmain()FILE*in=fopen("rockers.in","r");FILE*out=fopen("rockers.out","w");inta,b,c,d,best,numsongs,cdlength,numcds;fscanf(in,"%d%d%d",&n

30、umsongs,&cdlength,&numcds);for(a=1;a<=numsongs;a+)fscanf(in,"%d",&lengtha);best=0;for(a=0;a<numcds;a+)for(b=0;b<=cdlength;b+)for(c=0;c<=numsongs;c+)for(d=c+1;d<=numsongs;d+)if(b+lengthd<=cdlength)if(dpac+1>dpab+lengthdd)dpab+lengthdd=dpac+1;elseif(dpac+1>

31、;dpa+1lengthdd)dpa+1lengthdd=dpac+1;if(dpac>best)best=dpac;fprintf(out,"%dn",best);return0;解決背包問題動態規劃的定義:動態規劃的基本思想是把待求解的問題分解成若干個子問題,先求解子問題,然后再從這些子問題的解得到原問題的解,其中用動態規劃分解得到的子問題往往不是互相獨立的。動態規劃在查找有很多重疊子問題的情況的最優解時有效。它將問題重新組合成子問題。為了避免多次解決這些子問題,它們的結果都逐漸被計算并被保存,從簡單的問題直到整個問題都被解決。因此,動態規劃保存遞歸時的結果,因而

32、不會在解決同樣的問題時花費時間。動態規劃只能應用于有最優子結構的問題。最優子結構的意思是局部最優解能決定全局最優解(對有些問題這個要求并不能完全滿足,故有時需要引入一定的近似)。簡單地說,問題能夠分解成子問題來解決。求解步驟如下:1. 找出最優解的性質,并刻畫其結構特征;2. 遞歸地定義最優值;3. 以自底向上的方式計算出最優值;4. 根據計算最優值時得到的信息,構造最優解。問題描述及實現:背包問題:解決背包問題的方法有多種,動態規劃,貪心算法,回溯法,分支定界法都能解決背包問題。其中動態規劃,回溯法,分支定界法都是解決0-1背包問題的方法。背包問題與0-1背包問題的不同點在于在選擇物品裝入背

33、包時,可以只選擇物品的一部分,而不一定是選擇物品的全部。在這里,我們組用的有貪心法和動態規劃法來對這個問題進行算法的分析設計。用動態規劃的方法可以看出如果通過第n次選擇得到的是一個最優解的話,那么第n-1次選擇的結果一定也是一個最優解。這符合動態規劃中最優子問題的性質。動態規劃方法是處理分段過程最優化一類問題極其有效的方法。在實際生活中,有一類問題的活動過程可以分成若干個階段,而且在任一階段后的行為依賴于該階段的狀態,與該階段之前的過程是如何達到這種狀態的方式無關。這類問題的解決是多階段的決策過程??紤]用動態規劃的方法來解決,這里的:階段是:在前n件物品中,選取若干件物品放入背包中;狀態是:在前n件物品中,選取若干件物品放入所??臻g為w的背包中的所最大價值;決策是:第n件物品放或者不放;由此可以寫出動態轉移方程:我們用fi,j表示在前i件物品中選擇若干件放在所??臻g為j的背包里所能獲得最大價值是:fi,j=maxfi-1,j-wi+pi(j>=wi),fi-1,j。這樣,我們可以自底向上地得出在前m件物品中取出若干件放進背包能獲得的最大價值,也就是fm,w令f(i,j)表示用前i個物體裝出重量為j的組合時的最大價值f(i,j)=maxf(i-1,j),f(i-1,j-wi)+vi,i>0,j&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論