動態規劃基礎

2021-07-24 05:08:03 字數 1966 閱讀 1363

to find the fastest way through a factory.

這個問題我簡述下:

乙個產品的出場要經過多道工序的加工方可出場。某工廠有兩條工作線,每條工作線都具有n道工序。並且對應位置的工序執行相同的操作,但是他們具有不同的時間代價。在同一條工作線當中,由當前工序轉移到下一道工序是沒有時間代價的,但是從不同的工做線轉移是具有時間代價的。

現在的問題就是:給出每條工作線各個工序的時間代價,以及不同工作線工序互相轉移的時間代價。求出乙個產品出廠前所要經歷的最短時間。如下圖所示:

首先,分析原問題解的結構。

假設,s1,

j 是原問題最優解所經歷的工序,當s1

,j來自於s1

,j−1

時,s1

,j−1

一定也是原問題最優解所經歷的工序。即s1

,j是最快的,而它又來自於s1

,j−1

,那麼s1

,j−1

也一定是最快的。否則,如果到達s1

,j−1

不是最快的,那麼我們用更快的那條路到達s1

,j,則這條路是要比原來那條路更快的,而這與假設s1

,j是最快的互相矛盾。所以,如果即s1

,j是最快的,而它又來自於s1

,j−1

,那麼s1

,j−1

也一定是最快的。

所以,有如下的結論:

the fastest way through station s1

,j, is either

同樣的,

the fastest way through station s2

,j, is either

那麼,由對原問題的分析,我們可以定義如下的最優函式,以及轉移函式

let fi

[j] denote the fastest possible time through station si

,j

最優函式: f∗

=min

(f1[

n]+x

1,f2

[n]+

x2)(1)

轉移函式: f1

[j]=

else

// 處理第二條流水線

if( dp2[j-1] < dp1[j-1] + t1[j-1] )

else

}int first = dp1[n-1] + x1;

int second = dp2[n-1] + x2;

int result = ( first < second )?first:second;

cout

<< result << std::endl;

// 尋找最優路徑的station

if( first < second )

ans[n-1] = 1;

else

ans[n-1] = 2;

for( int i = n-2 ; i >= 0; --i )

else

}for( int i = 0; i < n; ++i )

}#ifdef local

cin.close();

cout.close();

#endif

return

0;};

輸入資料檔案:input.dat62

3427

9348

4856

4572

3134

2122

1輸出檔案:output.dat

38station 1 , 1

station 2 , 2

station 1 , 3

station 2 , 4

station 2 , 5

station 1 , 6

動態規劃(基礎)

1 揹包 2 最長上公升子串行 3 線性dp 區間dp 4 記錄結果再利用的動態規劃 5 狀態壓縮dp 1 2 3 hdu dp題集 1 揹包問題 1 演算法 01 揹包問題,畫 2 挑戰程式設計競賽 3 揹包九講 4 揹包九講 自學筆記 1 完全揹包自學筆記 題目一覽表 考察知識點 完成時間 a ...

動態規劃基礎入門

什麼是動態規劃呢?顧名思義,動態地進行規劃?讓我們先來看個小遊戲 注 跳格仔的方案與順序有關,比如先跳一格,再跳兩格和先跳兩格,再跳一格是不同種方案。資料範圍 2 n 60 2 k n 遞推寫法 include intmain for int i k i n i printf d n dp n re...

動態規劃 基礎理解

動態規劃 英語 dynamic programming,簡稱 dp 是一種在數學 管理科學 電腦科學 經濟學和生物資訊學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。動態規劃背後的基...