1. 程式人生 > >2016級算法第三次上機-B.Bamboo和巧克力工廠

2016級算法第三次上機-B.Bamboo和巧克力工廠

pri span 切割 算法 動態規劃 流水線 一個 依然 輸入

B Bamboo和巧克力工廠

分析

三條流水線的問題,依然是動態規劃,但是涉及的切換種類比較多。比較易於拓展到n條流水線的方式是三層循環,外層是第k個機器手,裏面兩層代表可切換的流水線
核心dp語句:cost[i][k] = min(cost[i][k], cost[j][k-1]+t[j][i]+p[i][k])
也可以在A題的基礎上詳細的列出所有可能的路線切割情況然後找到最小值。

註意本題與A題中t的含義不同。

上機時給出的偽代碼

//數組從0開始    
const int maxx= 510;
 p[3][maxx];
 t[3][3];
 cost[3][maxx];//dp主體    
N=2
; M為輸入值 void resolve(int N,int M) { 初始化cost為無窮大 三條流水線的初始值為對應的P值: cost[i][0] = p[i][0]; for k=1:M-1 for i=0:2 for j = 0:2 cost[i][k] = min(cost[i][k], cost[j][k-1]+t[j][i]+p[i][k]); end end end 找出三條線路中在最後一個機器手時總用時的最小值即為所求 }

代碼

const int maxx= 510;
int p[3][maxx];
int t[3][3];
int cost[3][maxx];
const int MAX = (1<<30);
void Resolve(int n,int m)
{
    int i,j;
    for(i= 0; i<n; i++)
        for(j =0; j<m; j++)
            cost[i][j]  = MAX ;
    for(int i= 0; i<n; i++)
        cost[i][0] = p[i][0];

    for(int
k = 1; k<m; k++) for(int i = 0; i<n; i++) for(int j = 0; j<n; j++) { cost[i][k] = min(cost[i][k], cost[j][k-1]+t[j][i]+p[i][k]); } int ans = 500000000; for( i =0; i<n; i++) { if(cost[i][m-1]<ans) ans = cost[i][m-1]; } printf("%d\n",ans); } int main() { int m; while(scanf("%d",&m)!=EOF) { int i,j; for(i = 0; i<3; i++) for( j = 0; j<m; j++) scanf("%d",&p[i][j]); for(i= 0; i<3; i++) for( j = 0; j<3; j++) scanf("%d",&t[i][j]); Resolve(3,m); } }

2016級算法第三次上機-B.Bamboo和巧克力工廠