日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

递归讨论(二)续

發(fā)布時(shí)間:2025/4/9 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 递归讨论(二)续 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在討論二中,展示了鋼條分段的方法,只不過(guò)解題的方法采用的是自頂而下的策略。

個(gè)人理解的自頂而下的策略:

首先我們不知道一個(gè)大問(wèn)題的答案,但我們可以將問(wèn)題規(guī)模縮小,外加上已知的一部分。進(jìn)而變成求解這個(gè)小規(guī)模問(wèn)題答案的過(guò)程,利用遞歸原理,層層向下,最終回到一個(gè)最簡(jiǎn)單的問(wèn)題。

這種處理問(wèn)題的方式,難免會(huì)有重復(fù)求解的情況出現(xiàn)。上篇中也有提到!!!

先還是把上篇的部分代碼搞過(guò)來(lái)看看。

int get_max(int* price,int* len,int num,int *p)//新增的這個(gè)指針p指向一個(gè)記錄數(shù)組,下標(biāo)為長(zhǎng)度num-1,我們用來(lái)記錄對(duì)應(yīng)長(zhǎng)度num下的最大收益 {int result=0;if(num>=1&&p[num-1]>=0) //此處判斷就起到從記錄表中查值作用。return p[num-1];if(num == 0)//由標(biāo)記A處的num-len[i]以及其上的if判斷,可以看出下次調(diào)用get_max時(shí),可能出現(xiàn)num為0的情況return 0;for(int i=1;i<=6;i++){if(num >=len[ i-1]){result = std::max(result,get_max(price,len,num-len[i-1],p)+price[i-1]);//標(biāo)記A處 }}p[num-1] = result;return result; }

?

從代碼中,我們可以粗略計(jì)算下,總共調(diào)用了多少次get_max();首先在不斷的調(diào)用中,get_max()函數(shù)中的num值取遍了0-num,權(quán)且計(jì)作num次

在每次調(diào)用中,我們都需要for()循環(huán)下,(因?yàn)榇致杂?jì)算嘛)我們就不考慮其中的if判斷了。

最終我們計(jì)算出的調(diào)用次數(shù):num*6,很類似雙層循環(huán)啊

看num值從0變化到num的最大值

價(jià)格從1到6變化,嵌套在num的每次變化,顯然是雙層循環(huán)了。

我們?cè)俜治鱿?#xff1a;

上述程序中,每次調(diào)用的get(..num..),都為了計(jì)算當(dāng)前num的最大收益的吧。只不過(guò)大的num根據(jù)小的num計(jì)算出來(lái),通過(guò)遞歸調(diào)用實(shí)現(xiàn),但按照程序的實(shí)際運(yùn)行的順序來(lái)說(shuō),最終還是小num的最大收益先被計(jì)算出,然后返回給大的num的使用。這是一種從頂向下,然后結(jié)果再層層上返回的過(guò)程。

與其這么麻煩,我們不如先計(jì)算小num,然后將小num的值貢獻(xiàn)給比它大的num,這樣就減少了遞歸那樣不斷的調(diào)用了。(自下而上的策略)

這樣做的要求就是:我們必須保證num從1到最大時(shí),每個(gè)循環(huán)都獲得當(dāng)前num下的最大的收益,先上代碼好了:

void get_max(int* len,int* price,int n,int num,int *p,int* s)//其中n表示可分段種類數(shù) num為鋼條長(zhǎng)度,p記錄的當(dāng)前num下首次截?cái)嗟拈L(zhǎng)度,下標(biāo)為num,s記錄的當(dāng)前num下最大收益 {s[0] = 0;for(int i=1;i<=num;i++){int q = 0;//當(dāng)前num下,q用于第二層循環(huán)的最大收益的記錄for(int j=0;j<n;j++){if(i>=len[j]){s[i] = s[i-len[j]]+price[j];}if(s[i] > q)//當(dāng)條件成立時(shí),說(shuō)明當(dāng)前num下,最大收益的組合被更新了哦{q = s[i]; p[i]=j;}}s[i] = q;} }

這樣我們就獲得最大收益,同時(shí)也可以獲得如何分段的方法。

同時(shí)一定程度也減少了程序的復(fù)雜性。

如果下次再碰到動(dòng)態(tài)規(guī)劃問(wèn)題,就想想這個(gè)!理解比較淺薄,望指教!

轉(zhuǎn)載于:https://www.cnblogs.com/qinghua0310/p/4062935.html

總結(jié)

以上是生活随笔為你收集整理的递归讨论(二)续的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。