2016級算法第三次上機-B.Bamboo和巧克力工廠
阿新 • • 發佈:2017-12-04
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和巧克力工廠