Neighbor House

题目链接: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
",++t,d[n][0]);
31     }
32     return 0;
33 }
原文地址:https://www.cnblogs.com/q-c-y/p/4734809.html