SkyLee组装电脑(1537)装配线

匿名 (未验证) 提交于 2019-12-02 23:03:14

SkyLee组装电脑

 

题目描述

SkyLee想要组装一台电脑,而电脑需要按照固定的顺序进行安装,不能把配件都买好一起安装(因为SkyLee只会按照顺序安装,他分不清内存条和显卡)。

城市里有nn个电脑城,并且每个电脑城都有所有的配件卖,除了价格不同外完全一样。一台电脑一共有mm个配件,按照安装顺序编号为1m

假设第ii个电脑城的编号为jj的配件售价为p[i][j]p[i][j],从第ii个电脑城到第jj个电脑城的交通费用为f[i][j]f[i][j]。

那么SkyLee组装好整台电脑最少需要多少钱呢?(配件费用+交通费用)

输入

多组数据输入

第一行两个整数nn和mm,分别为电脑城数量和配件数量(2<n,m<=500)

接下来nn行,每行mm个整数,表示配件的价格p[i][j]p[i][j](0<=p[i][j]<=500)

接下来nn行,每行nn个整数,表示交通费用f[i][j]f[i][j](0<=f[i][j]<=500)

输出

对于每组数据,输出一行,为最小费用

输入样例

3 3 10 1 10 8 5 10 10 10 2 0 5 2 1 0 5 1 1 0

输出样例

14ALS问题(装配线)的扩展
#include <iostream> #include<cstdio> using namespace std;  const int maxn=507; const int inf=999999; int p[maxn][maxn]; int f[maxn][maxn]; int dp[maxn][maxn]; int m,n; void findmin(){     int themin;     for(int i=1;i<=n;i++){         dp[i][1]=p[i][1];     }     for(int j=2;j<=m;j++){         for(int i=1;i<=n;i++){                 themin=inf;             for(int k=1;k<=n;k++){                 if(dp[k][j-1]+f[k][i]+p[i][j]<themin)                     themin=dp[k][j-1]+f[k][i]+p[i][j];             }              dp[i][j]=themin;         }      } } int main() {      int themin;     while(~scanf("%d%d",&n,&m)){         for(int i=1;i<=n;++i){             for(int j=1;j<=m;++j){                 scanf("%d",&p[i][j]);             }         }         for(int i=1;i<=n;++i){             for(int j=1;j<=n;++j){                 scanf("%d",&f[i][j]);             }         }         findmin();         themin=inf;         for(int i=1;i<=n;++i){             if(themin>dp[i][m])                 themin=dp[i][m];         }         printf("%d\n",themin);      } }

 

 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!