题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=26767
题意:
有n户人,打算把他们的房子图上颜色,有red、green、blue三种颜色,每家人涂不同的颜色要花不同的费用,而且相邻两户人家之间的颜色要不同,求最小的总花费费用。
案例:
Sample Input
2
4
13 23 12
77 36 64
44 89 76
31 78 45
3
26 40 83
49 60 57
13 89 99
Sample Output
Case 1: 137
Case 2: 96
思路分析:
通过两层循环,找出上下两家人房子图不同颜色花费的最小值,再经过n次的再循环,找到最后一层的最小值,即为最少花费。
需要经过相关的预处理。
源代码如下:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int main() 5 { 6 int T,t=0,a[22][3],d[22][5],n,m; 7 scanf("%d",&T); 8 while(T--) 9 { 10 int i,j,k; 11 scanf("%d",&n); 12 for(i=0;i<n;i++) 13 scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]); 14 for(i=0;i<=n;i++) //预处理 15 d[i][4]=d[i][0]=20000; 16 for(i=0;i<=3;i++) 17 d[0][i]=0; //预处理 18 for(i=1;i<=n;i++) 19 for(j=1;j<=3;j++) 20 { 21 m=20000; //使m为最大值,以便第一个数绝对会替换 22 for(k=1;k<=3;k++) 23 if(k!=j&&d[i-1][k]+a[i-1][j-1]<m) 24 m=d[i-1][k]+a[i-1][j-1]; 25 d[i][j]=m; 26 } 27 for(i=1;i<5;i++) 28 if(d[n][i]<d[n][0]) //找到最小值 29 d[n][0]=d[n][i]; 30 printf("Case %d: %d\n",++t,d[n][0]); 31 } 32 return 0; 33 }
时间: 2024-11-04 15:25:11