SkyLee组装电脑
题目描述
SkyLee想要组装一台电脑,而电脑需要按照固定的顺序进行安装,不能把配件都买好一起安装(因为SkyLee只会按照顺序安装,他分不清内存条和显卡)。
城市里有nn个电脑城,并且每个电脑城都有所有的配件卖,除了价格不同外完全一样。一台电脑一共有mm个配件,按照安装顺序编号为1−m1−m。
假设第ii个电脑城的编号为jj的配件售价为p[i][j]p[i][j],从第ii个电脑城到第jj个电脑城的交通费用为f[i][j]f[i][j]。
那么SkyLee组装好整台电脑最少需要多少钱呢?(配件费用+交通费用)
输入
多组数据输入
第一行两个整数n和m,分别为电脑城数量和配件数量(2<n,m<=500)
接下来n行,每行m个整数,表示配件的价格p[i][j]p[i][j](0<=p[i][j]<=500)
接下来n行,每行n个整数,表示交通费用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
分析:
已知信息:
组装费p[n][m]
交通费f[n][n]
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 ",themin); } }