SkyLee组装电脑(1537)装配线

SkyLee组装电脑

 

题目描述

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

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

假设第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

输出样例

14

ALS问题(装配线)的扩展
#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);

    }
}
扫描二维码关注公众号,回复: 4483702 查看本文章
 

猜你喜欢

转载自www.cnblogs.com/loganlzj/p/10111876.html