3 動態規劃問題中的最優路徑儲存與輸出

2022-09-18 07:21:28 字數 1863 閱讀 5414

在動態規劃問題中,我們經常會遇到以下問題,最優解倒是求出來了,但是最優解的路徑呢?如何輸出?這確實是乙個問題,而且往往比較難喲。。我這裡說的路徑是指,像在鋼條切割問題中,從哪些地方切可以達到最優化,在矩陣鏈乘問題中,從哪些地方進行組合可以使效率最高?

for(j

=1;j

<=i;

j++)

while(n

>0) 

在以上問題中,由於我們只要記住切割點就可以了,因為鋼條的**只與它的長度有關,與位置無關,因此可以說是乙個一維的問題。 於是只要用乙個一維的陣列記錄

就可以了,也就是用陣列的下標表示為鋼條的長度,而該位置陣列的值表示為切割的位置 ,如下

pathstore[i]=j表示對於長度為i的鋼條的它的最優解是從位置j進行切割。

其實我們要明白一點,那就是我們的每次迭代都只產生一次切割。

for(inti=

1;i<=

length;i

++)

在上面的程式中,其實如果在「歸」到最後的時候,上面只產生了一次切割,也就是從i=1到i<=length,我們只切割一次。只需記錄一次就可以了。

然後每次子問題的迭代都會記錄一次這些問題。

while(n

>0)

這個就是輸出**囉。。你看,首們我們n被初使化成了length,實參。於是第一次會列印當長度為length時的切割位置,也就是從**切割。然後進入到子問

題所記錄的切割點。這裡我人還剩下多少呢?n-pathstore[n],這就是我們的第乙個子問題所要處理的長度,於是有人問,難道pathstore[n]就不需要處理了嗎?

其實我們的**是這麼寫的,在主**中,

for(inti=

1;i<=

length;i

++)

我們是固定左邊,也就是左邊不切割,只切割右邊。當然我們也就只記錄右邊的點囉。

if(

multicount

>(

multiplay_iterator

(multidem

,start,i

)+multiplay_iterator

(multidem,i

+1,end

)+multidem

[start-1

]*multidem[i

]*multidem

[end

]))

void

printmultipath

(int

start

,int

end)

我們有處理這個問題用了乙個二維陣列,因為這種情況和位置有關呢,其行和列分別表示start和end。

int

storepath[20

][20

]=;

不同於鋼條只與長度有關。而且輸出該組合也用了遞迴的思想。原問題->子問題->子子問題->.....->子....子問題。。。

printmultipath

(start

,storepath

[start

][end

]);

printmultipath

(storepath

[start

][end]+1

,end

);

來自為知筆記(wiz)

動態規劃求最優路徑

dynamic.py,基於動態規劃求最優路徑 import matplotlib.pyplot as plt import pylab as pl import connmysql import pandas as pd sql2 select id,distance,duration from t...

最優配對問題(動態規劃)

空間裡有n個點p0,p1,p2.pn 1,你的任務是把他們配成n 2對 n是偶數 使得每個點恰好在乙個點對中。所有點的距離之和應該盡量小。n 20.定義狀態d i s 為前i個點中,位於集合s的元素兩兩配對的最小距離,則狀態轉移方程就是 d i,s min 其中 pipj 表示兩點之間的距離。邊界是...

動態規劃求解路徑問題

動態規劃求解的兩個條件 1 最優解問題 2 大問題可以拆分成小問題,大問題的最優解包含小問題的最優解,將小問題的最優解儲存起來,在求大問題最優解的時候無需重新求解,直接拿來用即可。具體問題 需求一 給定m n矩陣,從左上角出發,到右下角,每次只能向右走或者向下走,求共有多少路徑?分析 假設路徑數是f...