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